java中图像的HTML画布字节数组
真实图像
生成图像
我在客户端有多个使用Javascript(SAP/Open-UI-5)生成的图(比如最多14个),我已经将这些图转换为字节数组,下面是相同的代码
JavaScript代码
var arrCanvas = document.getElementsByTagName("canvas");
var arrImageByte = [];
for(var i=0; i<arrCanvas.length; i++){
var canvas = arrCanvas[i];
if(canvas.width!=0 && (typeof imageNames[i] != 'undefined')){
var imageDetail = {};
var uint8Array = canvas.getContext("2d").getImageData(0,0,canvas.width,canvas.height).data;
imageDetail.byteData = [].slice.call(uint8Array);
imageDetail.name = imageNames[i];
imageDetail.height = canvas.height;
imageDetail.width = canvas.width;
arrImageByte.push(imageDetail);
}
}
现在我使用RESTAPI和AJAX调用将这些字节发送到服务器端 下面是在服务器端创建映像的代码,我在其中重新创建映像
Java代码
int width = imageDetail.getWidth();
int height = imageDetail.getHeight();
byte[] data = imageDetail.getByteData();
String name = imageDetail.getName();
BufferedImage bufferedImage =new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// calculate array offset
final int o = (x * 3) + (y * width * 3);
// set the pixel color here we will need to convert the byte
// data to an unsigned
// value using &0xFF before passing it to the Color
// constructor
bufferedImage.setRGB(x, y, new Color(data[o + 1] & 0xFF, data[o + 2] & 0xFF, data[o + 3] & 0xFF).getRGB());
}
}
boolean result = ImageIO.write(bufferedImage, "jpg", new File(baseReportFolderLocation+name+".jpg"));
logger.info("Name "+name+" status :: "+result);
但是我的图像的颜色与预期的不一样。如何以与在客户端创建图像时完全相同的颜色重新创建图像
我也尝试了下面的代码
byte[] data = imageDetail.getByteData();
String name = imageDetail.getName();
BufferedImage bImageFromConvert = ImageIO.read(new ByteArrayInputStream(data));
ImageIO.write(bImageFromConvert, "jpg", new File(baseReportFolderLocation+"New_"+name+".jpg"));
最后一行抛出异常
java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1592)
# 1 楼答案
这里有一个简单的解决方案,避免循环和所有手动工作
必选:
org.apache.commons.codec.binary.Base64
类。所以把这个添加到你的类路径中如果使用Maven,请将以下依赖项添加到
pom.xml
如果使用
jar
作为依赖项,请在lib
或类路径中添加以下jar文件Apache Commons Codec Jar File
解决方案:
下面是我的图片,我将使用
byte array
重新创建它注意颜色:-
这只是为了验证不同的颜色是否被正确保留
代码
输出将是完全相同的图像,但我已将其转换为
jpg
(请参见代码),因此该图像现在是jpg。可以指定所需的任何格式输出图像:
看到颜色了吗,同样的颜色被重新创造而不丢失
现在,正如我所理解的,您正在从客户机接收
byte
数组,所以请遵循上面代码中的注释。你完了。甚至不需要使用javax.imageio.ImageIO
希望能有帮助
# 2 楼答案
我遵循了您描述的代码(感谢您,因为它帮助我分析了我所面临的问题,我也遵循了类似的方法),在java代码中做了以下更改后,我制作了与原始图像完全相同的图像