我正在尝试BufferedImage
通过套接字发送,我通过将图像转换为byte[]
然后在将其编码为 Base64 后将其发送过来。我发送了 2 个 BufferedImages,其中一个是“满的”,另一个是大约 50% 的透明。我遇到的问题是,当它们到达时,第二张图像在视觉上仍然是透明的,但是当我通过 Raster 获取数据数组时,它已经改变了。
我做了一个小测试代码来演示这个问题;
BufferedImage levelBufferedOriginal = ...
BufferedImage backgroundBufferedOriginal = ...
byte[] levelDataOriginal = ((DataBufferByte) levelBufferedOriginal.getRaster().getDataBuffer()).getData();
byte[] backgroundDataOriginal = ((DataBufferByte) backgroundBufferedOriginal.getRaster().getDataBuffer()).getData();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] temp = null, temp2=null;
try {
ImageIO.write(levelBufferedOriginal, "png", baos);
baos.flush();
temp = baos.toByteArray();
baos.close();
baos=new ByteArrayOutputStream();
ImageIO.write(backgroundBufferedOriginal, "png", baos);
baos.flush();
temp2 = baos.toByteArray();
baos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
BufferedImage levelBufferedNew = null;
BufferedImage backgroundBufferedNew = null;
try {
levelBufferedNew = ImageIO.read(new ByteArrayInputStream(temp));
backgroundBufferedNew = ImageIO.read(new ByteArrayInputStream(temp2));
} catch (IOException e) {
e.printStackTrace();
}
byte[] levelDataNew = ((DataBufferByte) levelBufferedNew.getRaster().getDataBuffer()).getData();
byte[] backgroundDataNew = ((DataBufferByte) backgroundBufferedNew.getRaster().getDataBuffer()).getData();
System.out.println("LEVEL: " + Arrays.equals(levelDataOriginal, levelDataNew));
System.out.println("BACKGROUND: " + Arrays.equals(backgroundDataOriginal, backgroundDataNew));
我在这里所做的只是将 转换BufferedImage
为byte[]
,然后返回,并比较我从中获得的数据DataBufferByte
。输出是
水平:假
背景:真实
背景是“完整”图像,而级别是具有一些透明像素的图像。
如果总体思路是错误的,我想听听另一个,我想要的只是能够准确地重新创建 2 个缓冲图像。