【问题标题】:White is not white白色不是白色
【发布时间】:2011-03-22 19:09:00
【问题描述】:

在 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 是位图。

为什么会这样?如何解决?

【问题讨论】:

  • 什么是必要的白色位图?可以使用一堆空行:P
  • 但是:为什么这么长,或者为什么不只是一个链接?
  • 链接到位图而不是附加到问题。
  • @hgpc:(我可能是错的,但是)RGB_565 中有纯白色和纯黑色。只是两者之间的精度较低。问题是纯白色 RGB_8888 是否转换为 RGB_565 中的纯白色。在 565 窗口上使用 8888 图像时,我遇到了条带问题,但从来没有这种程度的不同。
  • @hgpc 天真地将 RGB_565 转换为 RGB_888 会给你#f8fcf8;见this question。除非我弄错了,否则我会说发生了其他事情。

标签: android bitmap


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    默认格式似乎会根据 SDK 版本和设备类型而变化,因此只需将其强制保持为 RGB_565

    【讨论】:

      【解决方案3】:

      有一个非常相似的问题,即使不是完全相同的问题,即使将 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 类型。

      【讨论】:

        【解决方案4】:

        这可能是图像类型和 ImageView 正在渲染的位图之间的差异,请参阅Bitmap.Config。以不同的模式加载您的图像,看看是否有帮助。请查看Bitmap quality and banding 了解更多信息。

        【讨论】:

        • 你能详细说明一下吗?我添加了我正在使用的 Bitmap.Config (RGB_565)。
        • 尝试将窗口和图像设置为使用相同的 RGB 模式,看看会发生什么。将图像设置为如上,窗口设置为getWindow().getAttributes().format。试试RGB_8888看看是不是白的。你知道你的原始图像是什么 RGB 格式吗?
        • 没有。如何检查图像的 RGB 格式(问题中链接,顺便说一句)?根据 Mac OS X Preview,我知道它是 RGB,深度是 8。
        【解决方案5】:

        这就是为我解决这个问题的方法:

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

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

        【讨论】:

        • 对不起,这应该像原始问题一样重新采样。它是 BitmapFactory.Options 的一个实例,然后用作 BitmapFactory.decode*-method 的参数。
        【解决方案6】:

        你可以改变

        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.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多