【问题标题】:android bitmap getPixels return 0 at zero alpha Pixelsandroid bitmap getPixels 在零 alpha 像素处返回 0
【发布时间】:2017-02-11 15:58:18
【问题描述】:

首先,我将所有像素设置为零 alpha 通道。

bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);  
Canvas c = new Canvas(bitmap);
// draw somethings in the bitmap...

bitmap.getPixels(pixs, 0, w, 0, 0, w, h);
for(int i=0;i<pixs.length;i++) {
    pixs[i] = pixs[i] & (0x00ffffff);
}

接下来我将这些像素放入位图中,然后再次调用 getPixels。

bitmap.setPixels(pixs, 0, w, 0, 0, w, h);
bitmap.getPixels(pixs, 0, w, 0, 0, w, h);

最终结果pixs被0填充。

为什么?为什么位图会丢失 rgb 值?

【问题讨论】:

    标签: android bitmap pixels


    【解决方案1】:

    因为当你初始化一个位图时,所有的像素都被初始化为 0. 0 & any = 0.

    如果您想设置默认颜色,那无论如何都是一种非常低效的方法。设置画布以绘制到该位图并使用 drawColor

    【讨论】:

      【解决方案2】:

      最后我在 android/graphics/Bitmap.cpp 中发现了一些奇怪的东西,当位图为premultiplied 时,它将使用FromColor_D32 将像素填充到位图中,这将首先对所有像素进行预乘。所以FromColor_D32_Raw是我想要的。

      static FromColorProc ChooseFromColorProc(const SkBitmap& bitmap) {
          switch (bitmap.colorType()) {
              case kN32_SkColorType:
                  return bitmap.alphaType() == kPremul_SkAlphaType ? FromColor_D32 : FromColor_D32_Raw;
              case kARGB_4444_SkColorType:
                  return bitmap.alphaType() == kPremul_SkAlphaType ? FromColor_D4444 :
                          FromColor_D4444_Raw;
              case kRGB_565_SkColorType:
                  return FromColor_D565;
              case kAlpha_8_SkColorType:
                  return FromColor_DA8;
              default:
                  break;
          }
          return NULL;
      }
      

      解决方案是在调用 setPixels 之前添加以下内容。

      bitmap.setPremultiplied(false);
      

      但也会导致画布无法绘制位图。

      【讨论】:

        猜你喜欢
        • 2011-05-09
        • 1970-01-01
        • 2020-01-28
        • 2012-11-06
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多