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