问题描述
|
在Android中处理某些位图时,我注意到视图中使用的白色并不总是与位图上呈现的白色相同。考虑此屏幕截图。
背景白色是从具有白色背景颜色的角度来看的。
前景\“ white \”来自从SD卡解码的白色位图,显示在ImageView中。该位图使用ѭ0进行解码,如下所示:
BitmapFactory.Options resample = new BitmapFactory.Options();
resample.inPreferredConfig = Config.RGB_565;
resample.inSampleSize = sampleSize;
return BitmapFactory.decodeFile(filePath,resample);
供参考,这是位图。
为什么会这样,如何解决?
解决方法
我遇到了同样的问题,经过一些实验,我注意到注释comment2解决了这个问题。大于3的33ѭ的任何值都将显示此效果(删除
<uses-sdk>
标记会将minSdkVersion
更改为1。
,尝试在onCreate中设置getWindow().setFormat(PixelFormat.RGB_565)
。
默认格式似乎会根据SDK版本和设备类型而更改,因此只需强制将其保持在RGB_565
,发生了非常相似的问题,即使将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。
,图像类型和ImageView呈现在其上的位图之间可能有所不同,请参见Bitmap.Config。以不同的模式加载图像,看看是否有帮助。看一下位图的质量和条带以获取更多信息。
,这是为我解决的问题:
您需要设置屏幕密度,以防止位图工厂重新缩放位图。这是通过以下代码完成的:
DisplayMetrics displayMetrics=new DisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(displayMetrics);
resample.inScreenDensity = displayMetrics.densityDpi;