Android中背景图片质量差劲

16

我正在尝试在我的活动中放置一个背景,但是图像质量并不符合预期。

该图像具有简单的渐变和蓝色条纹,目前看起来像这样:

LinearLayout 背景

我的活动布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/background_register"
    android:drawingCacheQuality="high" >
</LinearLayout>

背景描述符(drawable/background_register):

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:antialias="true"
    android:dither="true"
    android:filter="true"
    android:tileMode="repeat"
    android:gravity="center"
    android:src="@drawable/background_blue_565" />

目前我有一个描述BitmapDrawable的XML文件,它是活动的LinearLayout背景。但是到目前为止我已经尝试了所有找到的方法,启用了抖动、反锯齿、平铺、RGBA_8888模式......你说得出来的都试过了。是否有人有不同的解决方案或者想法可以尝试?我会非常感激。

顺便说一句,我是在Galaxy S II上开发这个应用程序。

3个回答

42

首先确保原始图片质量良好以避免问题从源头开始。
然后在您的onCreate()方法中执行:

code1:

getWindow().getDecorView().getBackground().setDither(true);
getWindow().setFormat(PixelFormat.RGBA_8888);

已弃用:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

如果要将图像显示为32位图像(RGBA-8888配置),则需要在加载视图的位置添加以下代码:

code2:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap gradient = BitmapFactory.decodeResource(getResources(), R.drawable.gradient, options);

findViewById(R.id.main).setBackgroundDrawable(new BitmapDrawable(gradient));


不同方法的比较: (这些都是应用程序生成的截图)

我的源图像(左侧为64种颜色,右侧为24位):
image1 和 image2:
64-color24 bit
1:使用布局 XML 设置为背景的原始64色图像(image1):
Raw image
2:使用code1 的相同图像(image1):
Dithered image
3:同时使用code1code2 的相同图像(image1):
explicit 32bit
4:使用code1code2 加载的 image2(在此情况下,抖动并不重要,因为源和目标都使用每个颜色8位):
higher original quality

请注意,图像3中的结果伪影已经存在于原始图像中。

注意:如果有人知道如何将图像缩小一点,请随时编辑此帖子……


感谢您的快速回复! 我尝试了您提出的所有建议,但是都没有成功。这张图片很好,当我在Android图库中查看它时,看起来非常棒。 - gnclmorais
我只是在设置背景。我已经更新了我的问题与布局,这样可能会更清晰。 - gnclmorais
Java,我按照你写的做了(谢谢!),目前图片看起来是这样的:http://bit.ly/w4ErRR 正如你所看到的,它还不完美... 不过还是谢谢你,现在好了一点。如果你找到更好的解决方案,请分享! - gnclmorais
现在看起来好多了 :) 如果我找到更好的解决方案,我会更新我的答案。 - Jave
好的,看起来您提供的代码和我们尝试过的成千上万种图像配置之一一起使用,起作用了...所以谢谢!但这是Android中的一个可怕问题。确实很糟糕。Google应该想办法解决这个问题。 - gnclmorais
显示剩余2条评论

6
问题在于你的PNG已经被转换为256种颜色,打开你选择的ZIP工具并手动检查你的APK。如果是这种情况,请确保你的PNG具有以下特点:

  1. 一个alpha通道
  2. 一个略微透明的像素

这应该可以防止它被转换为索引调色板。


嗨 Gaz! 似乎图像在 APK 中被压缩了,但是从中提取并在 Android 图库中显示它时,显示的是一张完美的图像,没有任何压缩或伪影问题。即使有 alpha 通道和透明像素也是如此。 - gnclmorais
2
哎呀,谢谢你啊。我的应用程序中有一张图片出了问题,我打开应用程序后发现它确实被转换成了256色的PNG格式。问题是,即使有透明度,我仍然无法正确地导出它。:/ 至少现在我知道问题所在了... - zeh

0

在我看来,这似乎是一个图像问题。你保存图像和格式的设置是什么?从我的角度来看,它看起来像是压缩伪影。


谢谢您的快速回复! 图片很好,当我在Android图库中看到它时,看起来非常棒。 似乎操作系统压缩了图片太多,特别是当它具有渐变时。 - gnclmorais
问题在于您的图像使用非常有限的调色板进行压缩,可能只有256种颜色。如果没有足够的信息,渐变就会像那样被降级。确保您正在使用相同的图像。就像Gaz建议的那样,打开您的APK并检查它。还将图像保存为jpg格式并再次尝试。如果可以正常工作,则问题出在您的图像上。 - Astronaut
据我所知,如果图像使用超过256种颜色,则不应压缩,但我可能是错误的。 - Jave
Adam Surfari,那不可能是答案...我打开了APK,提取了图像,并在Android画廊中打开了图像,它看起来完美无瑕。这一定是应用程序在将图像应用为LinearLayout背景时所做的某些操作... - gnclmorais

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