在处理Android中的某些位图时,我注意到视图中使用的白色并不总是与位图上呈现的白色相同。考虑一下这个截图。
背景白色来自白色背景色的视图。
前景“白色”来自从SD卡解码的白色位图,显示在ImageView中。使用RGB_565
对此位图进行解码,如下所示:
BitmapFactory.Options resample = new BitmapFactory.Options();
resample.inPreferredConfig = Config.RGB_565;
resample.inSampleSize = sampleSize;
return BitmapFactory.decodeFile(filePath, resample);
作为参考,here是位图。
为什么会这样,以及如何解决?
答案 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。