将24位位图数据正确加载到32位Bitmap对象中

use*_*789 5 java android bitmap

我正在尝试将包含24位位图文件数据的字节数组加载到Android中的Bitmap对象中,但我遇到了麻烦,因为Bitmap只支持32位和16位格式.以下是我为了将24位数据转换为32位而想出的内容:

byte[] file = new byte[is.available()];
is.read(file);
is.close();
byte[] paddedFile = new byte[file.length + file.length / 3]; //we will be adding 1 more byte (alpha value) for each RGB triplet
for (int i = 0; i < file.length / 3; i++) {
    paddedFile[i * 4] = file[i * 3];
    paddedFile[i * 4 + 1] = file[i * 3 + 1];
    paddedFile[i * 4 + 2] = file[i * 3 + 2];
    paddedFile[i * 4 + 3] = -1; //manually added alpha channel
}
Bitmap screen = Bitmap.createBitmap(479, 616, Bitmap.Config.ARGB_8888); //exact dimensions of the 24-bit bitmap file
screen.copyPixelsFromBuffer(ByteBuffer.wrap(paddedFile));
iv.setImageBitmap(screen);
Run Code Online (Sandbox Code Playgroud)

它几乎/几乎有效.这是我正在使用的位图:

BMP

以上代码显示在上面的代码之后:

paddedbmp

为什么会扭曲?任何关于如何解决这个问题的线索非常感谢.

har*_*ldK 2

如果我对填充的看法是正确的,你应该能够这样做:

int w = 479;
int h = 616;

byte[] file = /* as before */;

// Convert interleaved byte RGB to packed int ARGB
int[] paddedFile = new int[file.length / 3];
for (int i = 0; i < file.length / 3; i++) {
    paddedFile[i] = 0xff << 24 // Alpha (all opaque)
                  | ((file[i * 3] & 0xff) << 16) 
                  | ((file[i * 3 + 1] & 0xff) << 8) 
                  | ((file[i * 3 + 2] & 0xff)) 
}

int stride = w + (w % 4 == 0 ? 0 : 4 - (w % 4));
Bitmap screen = Bitmap.createBitmap(paddedFile, 0, stride, w, h, Bitmap.Config.ARGB_8888); 
Run Code Online (Sandbox Code Playgroud)