【发布时间】:2015-04-20 12:33:23
【问题描述】:
我正在尝试将包含 24 位位图文件数据的字节数组加载到 Android 中的位图对象中,但我遇到了麻烦,因为位图仅支持 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);
它有点/几乎可以工作。这是我正在使用的位图:
下面是上面代码之后的内容:
为什么会变形?非常感谢任何有关如何解决此问题的线索。
【问题讨论】:
-
请显示图片
-
我确实尝试先将 alpha 值添加到 paddedFile[i *4] 但我得到了奇怪的颜色。事实上,我分别尝试了 paddedFile[i *4] 和 paddedFile[i *4 + 3] 的值 -1/0/1,我在问题中发布的组合看起来最合理。
-
似乎每个扫描线(文件的)都被填充了。如果文件是 BMP,则将其填充到最近的 4 字节(32 位)边界。尝试使用采用
stride参数的createBitmap方法之一。