我正在接收 ARGB8888 格式的位图,但我需要通过一些只接受 RGB565 的算法来处理它。我想使用 Renderscript 将此位图转换为新格式,但似乎分配入和分配出应该相等(或兼容)。bitmapIn 是 ARGB_8888 类型, bitmapOut 是 RGB_565 类型
引起:android.renderscript.RSIllegalArgumentException:分配类型为 PIXEL_RGBA,类型为 4 字节的 UNSIGNED_8,传递的位图为 RGB_565
爪哇:
public void convert(final Bitmap bitmapIn, Bitmap bitmapOut)
{
mInAllocation = Allocation.createFromBitmap(mRS, bitmapIn, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
Type.Builder tb = new Type.Builder(mRS, Element.RGB_565(mRS)).setX(bitmapIn.getWidth()).setY(bitmapOut.getWidth());
mOutAllocation = Allocation.createTyped(mRS, tb.create());
// Call custom method (not forEach_root) so we can have uchar4 in and uchar3 out
mScript.forEach_convert(mInAllocation, mOutAllocation);
mOutAllocation.copyTo(bitmapOut);
}
渲染脚本:
// Convert to RGB565 by quantizing the individual channels
void convert(const uchar4* v_in, uchar3* v_out)
{
v_out->x = v_in->x >> 3;
v_out->y = v_in->y >> 2;
v_out->z = v_in->z >> 3;
}
请注意,如果我制作了两个位图 ARGB_8888 并在两个 uchar4* 上都使用了 convert() (并且只复制了 alpha (w) 通道,那么我看到位图被更改了。
我知道 565 等于 16 位,所以实际上它更可能是 uchar2,但它也与类型分配不兼容。
如何在 Renderscript 中进行这种类型转换?