白色不是白色

时间:2011-03-22 19:09:01

标签: android bitmap

在处理Android中的某些位图时,我注意到视图中使用的白色并不总是与位图上呈现的白色相同。考虑一下这个截图。

enter image description here

背景白色来自白色背景色的视图。

前景“白色”来自从SD卡解码的白色位图,显示在ImageView中。使用RGB_565对此位图进行解码,如下所示:

BitmapFactory.Options resample = new BitmapFactory.Options();
resample.inPreferredConfig = Config.RGB_565;
resample.inSampleSize = sampleSize;
return BitmapFactory.decodeFile(filePath, resample);

作为参考,here是位图。

为什么会这样,以及如何解决?

6 个答案:

答案 0 :(得分:3)

我有同样的问题,经过一些实验,我注意到评论<uses-sdk>解决了这个问题。 android:minSdkVersion高于3的任何值都会显示此效果(删除<uses-sdk>标记会有效地将minSdkVersion更改为1.

答案 1 :(得分:2)

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

默认格式似乎会根据SDK版本和设备类型进行更改,因此只需强制它保持RGB_565

答案 2 :(得分:1)

如果问题非常相似(如果不是完全相同),即使将PreferConfig设置为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。

答案 3 :(得分:0)

图像类型与ImageView呈现的位图之间可能存在差异,请参阅Bitmap.Config。以不同模式加载图像,看看是否有帮助。请查看Bitmap quality and banding以获取更多信息。

答案 4 :(得分:0)

以下是为我解决这个问题的原因:

您需要设置屏幕密度以防止位图工厂重新缩放位图。这是通过以下代码完成的:

DisplayMetrics displayMetrics=new DisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(displayMetrics);
resample.inScreenDensity = displayMetrics.densityDpi;

答案 5 :(得分:0)

您可以更改

resample.inPreferredConfig = Config.RGB_565; 

resample.inPreferredConfig = Config.ARGB_8888;

但是请注意,RGB_565有助于提高性能,如下所述: https://medium.com/@ali.muzaffar/performance-improvement-and-bitmap-pooling-in-android-f97b380cf965#:~:text=ARGB_8888%20has%2032%2Dbit%20color,faster%20to%20render%20as%20well