我在8BitARGB的颜色空间中有图像字节数组,需要将此字节数组转换为 java.awt.BufferedImage 。 代码如下:
public void getImage(byte byteArray[]){
int height = 1920;
int width = 1080;
ARGB_to_ABGR(byteArray);
BufferedImage image1 = new BufferedImage(height, width,
BufferedImage.TYPE_4BYTE_ABGR);
image1.getWritableTile(0, 0).setDataElements(0, 0, height, width, byteArray);
java.io.File file = new java.io.File("amazing.png");
try {
ImageIO.write(image1, "jpg", file);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
/*
* Swap the Red byte and Blue byte
*/
public void ARGB_to_ABGR(byte byteArray[]){
int length = byteArray.length;
byte r = 0;
byte b = 0;
for(int i = 0; i < byteArray.length; i++){
if(length % 4 == 0){
//do nothing
}else if(length % 4 == 1){
r = byteArray[i];
}else if(length % 4 == 2){
//do nothing
}else if(length % 4 == 3){
b = byteArray[i];
byteArray[i] = r;
byteArray[i - 2] = b;
}
}
}
我不认为原始字节数组有任何问题。为了快速调试,只是基于图像效果,任何人都可以告诉哪个字节(Alpha,红色,绿色,蓝色)是错误的?感谢您的帮助。
答案 0 :(得分:1)
在ARGB_to_ABGR
的代码中,您可能希望在i % 4
处写length % 4
。就像目前一样,我猜它根本就什么都不做。
答案 1 :(得分:1)
我认为@Henry是正确的,因为代码中只是一个简单的拼写错误。但是,我想提供一种替代的写作方式,这对我来说更容易阅读/理解,因此更容易出错。
我相信它也更快,因为它没有对索引进行测试。
此版本一次迭代输入字节数组一个像素(4个字节):
public void ARGB_to_ABGR(byte[] byteArray) {
byte tempR = 0;
for (int i = 0; i < byteArray.length; i += 4) {
// For each iteration, simply swap R and B
tempR = byteArray[i + 1];
byteArray[i + 1] = byteArray[i + 3];
byteArray[i + 3] = tempR;
}
}