白色不是白色的

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

在这里输入图像说明

背景白色是从白色背景颜色的视图。

前景“白色”是从SD卡解码的白色位图,显示在ImageView中。 该位图使用RGB_565解码,如下所示:

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

作为参考, 这里是位图。

这是为什么呢?如何解决?

  • Android图层列表:与app:srcCompat的位图问题
  • 从资源加载后,位图宽度/高度不同
  • Android试图使用一个回收的位图,而不是在我的代码
  • 在android中从video中提取位图
  • 如何从图片获取元数据?
  • 为什么有时候这不起作用?
  • 从指定的屏幕区域创build位图
  • Java:使用在线位图切片而不是离线渲染器时Scale Mapforge地图
  • 我有同样的问题,并经过一些实验,我注意到,评论<uses-sdk>解决了这个问题。 任何超过3的android:minSdkVersion值都会使这个效果出现(去掉<uses-sdk>标签有效地将minSdkVersion更改为1。

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

    默认格式似乎基于SDK版本和设备types而改变,所以只要强制它保持在RGB_565

    有一个非常相似,如果不是完全相同的问题,即使设置在ARGB_8888PreferredConfig没有帮助。

    从我可以收集到的: http : //android.nakatome.net/2010/04/bitmap-basics.html

    问题是Android会自动将24位图像抖动到16位,这可能会混淆颜色。 链接提到你可以通过为你的图片添加一个alpha通道来禁用这个function,或者从原始目录中加载它,而不是作为一个资源。

    由于这些都不是我的select,我发现以下终于工作:

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

    这里mDrawable的types是BitmapDrawable。

    这可能是图像types和ImageView所呈现的位图之间的差异,请参阅Bitmap.Config 。 加载你的图像在不同的模式,看看是否有帮助。 看看位图质量和条带了解更多信息。

    这是为我解决了这个问题:

    您需要设置屏幕密度以防止位图工厂重新调整位图。 这是用下面的代码完成的:

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