白色并不总是白色

9
在处理Android中的一些位图时,我注意到视图中使用的白色并不总是与位图上呈现的白色相同。请考虑以下截图。
背景白色来自具有白色背景颜色的视图。
前景“白色”来自从SD卡解码的白色位图,在ImageView中显示。此位图使用RGB_565进行解码,如下所示:
BitmapFactory.Options resample = new BitmapFactory.Options();
resample.inPreferredConfig = Config.RGB_565;
resample.inSampleSize = sampleSize;
return BitmapFactory.decodeFile(filePath, resample);

参考这里的位图。

为什么会出现这种情况,如何解决?


1
白色位图有什么必要吗?本来可以用一堆空行代替的 :P - Marlon
1
但是,为什么要这么长时间,或者为什么不只是一个链接呢? - Arjan
将位图链接到问题,而不是将其附加到问题。 - hpique
1
@hgpc:(我可能错了)在RGB_565中有纯白和纯黑。只是在它们之间的精度较低。问题是纯白RGB_8888是否转换为RGB_565中的纯白。当在565窗口上使用8888图像时,我遇到过带状问题,但从未出现如此大的差异。 - Joseph Earl
2
@hgpc 直接将 RGB_565 转换为 RGB_888 会得到 #f8fcf8;请参考这个问题。除非我错了,否则我认为还有其他问题存在。 - Josh Lee
显示剩余2条评论
6个回答

3

我也遇到了同样的问题,并经过一些实验发现,注释掉<uses-sdk>标签可以解决这个问题。任何android:minSdkVersion值大于3都会导致出现这种情况(删除<uses-sdk>标签实际上将minSdkVersion更改为1)。


2

尝试在 onCreate 方法中设置 getWindow().setFormat(PixelFormat.RGB_565)

默认格式似乎会根据 SDK 版本和设备类型而更改,因此将其强制设置为 RGB_565。


1

遇到了非常相似,如果不是完全相同的问题,即使将inPreferredConfig设置为ARGB_8888也没有帮助。

从我可以从http://android.nakatome.net/2010/04/bitmap-basics.html中获取的信息来看,问题是Android自动将24位图像抖动到16位,这可能会影响颜色。该链接提到,您可以通过向图像添加alpha通道或从原始目录而不是作为资源加载来禁用此功能。

既然对我来说这两个选项都不可行,我最终发现以下方法有效:

Paint ditherPaint = new Paint();
ditherPaint.setDither(true);
canvas.drawBitmap(mDrawable.getBitmap(), null, 
                  mDrawable.getBounds(), ditherPaint);

这里的mDrawable是BitmapDrawable类型。


0
这是我解决的方法:
您需要设置屏幕密度以防止位图工厂重新缩放位图。 可以使用以下代码完成此操作:
DisplayMetrics displayMetrics=new DisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(displayMetrics);
resample.inScreenDensity = displayMetrics.densityDpi;

1
抱歉,这应该被重新采样,就像原始问题中所述。它是一个BitmapFactory.Options的实例,然后用作BitmapFactory.decode *方法的参数。 - ChristophK

0

这可能是图像类型和 ImageView 渲染的 Bitmap 之间的差异,请参见 Bitmap.Config。以不同的模式加载您的图像,看看是否有所帮助。有关更多信息,请查看 位图质量和条纹状问题


你能详细一些吗?我添加了我使用的Bitmap.Config(RGB_565)。 - hpique
尝试设置窗口和图像使用相同的RGB模式,看看会发生什么。将图像设置为上述方式,并使用getWindow().getAttributes().format设置窗口。尝试使用RGB_8888并查看是否不是白色。您知道原始图像的RGB格式吗? - Joseph Earl
不,我该如何检查图像的RGB格式(顺便提一句,这个图像是在问题中链接的)?根据Mac OS X Preview的信息,我知道它是RGB格式,深度为8。 - hpique

0

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