高DPI手机上图像质量低下

3

我已经研究了相当长的时间。我有两部三星手机,一部是S4,另一部是Samsung Win。我的S4上的图像看起来像这样:

enter image description here

如果我在图像查看器上正常查看,那么该图像会呈现如下形式:

enter image description here

事实上,它需要看起来像这样。在我的三星Win上是这样的,但在S4上不是。
最初,图像的尺寸为700x256,然后将其升级到1280x455以适应三星S4,但仍然没有效果。它看起来一样。我不确定这是否是渐变带或缩放问题。我已经阅读了几篇文章和博客,并尝试了一些解决方案,例如将这些图像放在/raw文件夹中并设置:
@Override
public void onAttachedToWindow()
{
    super.onAttachedToWindow();
    getWindow().setFormat(PixelFormat.RGBA_8888);
}

然而没有任何效果。我的图像上仍然有相同的斑点像素。

我已阅读以下帖子:

Android:使用线性渐变作为背景看起来很粗糙

http://www.curious-creature.com/2010/12/08/bitmap-quality-banding-and-dithering/

http://android.nakatome.net/2010/04/bitmap-basics.html

我的工作性质需要一定的保密性,所以我裁剪了这里展示的图片。实际上我正在做一个类似Webtoon应用的漫画。不幸的是,无论我做了什么,这个应用在S4上看起来都很糟糕,像素很模糊。我正在使用Glide来加载图片,并尝试过this,但情况仍然相同。除了S4和Samsung Win之外,我还没有尝试过其他手机。我放弃了,我需要帮助。

任何帮助都将不胜感激!


2
在我看来,这似乎是JPEG图像的伪影。此外,请注意,放大会产生更多的伪影。 - Phantômaxx
1
将图像放入“-nodpi”文件夹中,并发布其外观。 - Nanoc
Glide?这意味着你正在从服务器加载图片,对吗? - Mohammed Atif
@MohammedAtif 不,我没有从服务器加载图像。我需要的所有文件都在我的应用程序的drawable/文件夹中。这是一个非常静态的漫画查看器。 - Neon Warge
2
那你为什么要使用Glide呢?为什么不用ImageView.setDrawableResource()?不必要地使用外部库会增加应用程序的大小并降低性能。 - Mohammed Atif
1个回答

0

使用Glide的原因有很多,不仅仅是因为Android提供了一些开箱即用的功能,例如内存管理和缩放视图等。

我发现,在使用Glide库时,有几种不同的方法和组件可能会导致色带和伪影问题。

当使用下面的库加载协议时:

SimpleTarget target  = new SimpleTarget<BitmapDrawable>() {
        @Override
        public void onResourceReady(@NonNull BitmapDrawable bitmapDrawable, @Nullable Transition<? super BitmapDrawable> transition) {
            bitmapDrawable.setDither(true);
            bitmapDrawable.setAntiAlias(true);
            pViewHolder.updateBitmap(bitmapDrawable.getBitmap());
        }
    };

    mGlideRequest.clone().format(DecodeFormat.PREFER_ARGB_8888).signature(signature).diskCacheStrategy(DiskCacheStrategy.DATA).load(current.mUri).into(target);

对我在提高质量和消除渐变带来的最大改进的是.diskCacheStrategy(DiskCacheStrategy.DATA),它强制库下载并存储原始图像以供以后引用和加载。

还可以看到,格式被强制转换为DecodeFormat.PREFER_ARGB_8888。这是因为Android可能会处理具有565而不是888 RGB表示的资源。因此,建议我们在Activity的窗口中添加这个:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    window.setFormat(PixelFormat.RGBA_8888);
}

这些是我一定会实施的更新,以消除带状和低质量图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接