为了账号安全,请及时绑定邮箱和手机立即绑定

HTML画布字节数组到java中的图像

HTML画布字节数组到java中的图像

倚天杖 2021-09-03 14:11:41
实际图像生成的图像我在客户端使用 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);  }}现在我使用 REST API 和 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"));
查看完整描述

2 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

我遵循了您描述的代码(谢谢,因为它帮助我分析了我面临的问题,并且我遵循了类似的方法),在对 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++) {

                    int o = (x * 4) + (y * width * 4);

                    bufferedImage.setRGB(x, y, new Color(data[o] & 0xFF, data[o + 1] & 0xFF, data[o + 2] & 0xFF).getRGB());

                }

            }   

            try {

                ImageIO.write(bufferedImage, "jpg", new File(PDFReportingUtil.baseReportFolderLocation+name+".jpg"));

            } catch (IOException e) {

                PDFReportingUtil.logger.error("Error while executing the thread "+Thread.currentThread().getName()+" ",e);

            }


查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信