我正在尝试在从外部源接收到字节后Bitmap使用 Android创建一个。Bitmap.Config.ARGB_8888据我了解,在 a 中设置原始字节Bitmap(不使用JNI)的最快方法是使用该copyPixelsFromBuffer()方法,但是出现了关于该缓冲区中字节的正确顺序的问题。
经过一番尝试和错误后,尽管事实上Config.ARGB_8888表明了正确的顺序,ARGB但似乎使用的内部格式Bitmap是RGBA. Activity您可以在ie中使用以下方法来测试此行为onCreate()(我已经在 Android 4.4.4 中测试了它,该方法确实进行了测试,copyPixelsToBuffer()但根据我的测试,copyPixelsFromBuffer()其行为是相同的):
private void testBitmap() {
// one pixel bitmap
Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
// as per javadoc, the int value is in ARGB format, so A=0xFF, R=0x11, G=0x22, B=0x33
bitmap.setPixel(0, 0, 0xFF112233);
ByteBuffer buffer = ByteBuffer.allocateDirect(4); // 4 bytes for the single pixel
bitmap.copyPixelsToBuffer(buffer);
buffer.position(0); …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些方法来将 Android 位图转换为 RGBA 字节数组,然后再转换回位图。问题是我似乎没有达到公式,因为颜色总是返回错误。我尝试过几种不同的假设,但没有成功。
所以,这是我认为很好的从 Bitmap 转换为 RGBA 的方法:
public static byte[] bitmapToRgba(Bitmap bitmap) {
int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
byte[] bytes = new byte[pixels.length * 4];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
int i = 0;
for (int pixel : pixels) {
// Get components assuming is ARGB
int A = (pixel >> 24) & 0xff;
int R = (pixel >> 16) & 0xff;
int G = (pixel >> 8) & 0xff;
int B …Run Code Online (Sandbox Code Playgroud)