android 位图 getPixels return 零 alpha 像素

android bitmap getPixels return 0 at zero alpha Pixels

首先,我将所有像素设置为零 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 值?

因为当您初始化位图时,所有像素都被初始化为 0。0 & anything = 0。

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

最后我在 android/graphics/Bitmap.cpp 中发现了一些奇怪的东西,当位图是 premultiplied 时,它会使用 FromColor_D32 将像素填充到位图中,这将 pre-multiplication 首先对所有像素。所以 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);

但是也会导致位图无法被canvas绘制。