【发布时间】:2019-05-25 11:15:22
【问题描述】:
我有一个 http 客户端,它获取一个包含 png 图像字符串的 json 响应,然后我会旋转该字符串。
一切都按预期工作,但我很想知道为什么(方法 1)在旋转之前将 http 响应图像作为 BufferedImage 保存在内存中,说 BufferdImage 比(方法 2)将 http 响应图像保存到文件然后读取慢在旋转相同的 BufferedImage 之前将该文件转换为 BufferedImage?
这与我们都知道在内存中进行类似的读/写操作比文件 i/o 更快的做法相反。我运行 java 的笔记本电脑有充足的内存和磁盘空间。
////////////METHOD 1 - WRITE/READ IMAGE FROM MEMORY
log.info("START TEST1 " + new Timestamp(System.currentTimeMillis()));
OutputStream outputStream = null;
byte[] imageByteArray =
Base64.decodeBase64(jsonObj.getString("LabelImages"));
//Convert byte array back to BufferedImage
InputStream in = new ByteArrayInputStream(imageByteArray);
BufferedImage img = ImageIO.read(in);
BufferedImage rotatedImg = rotate(img, 90);
File outputfile = new File("/var/opt/DI/tmp/rotatedlabel" + orderId + ".png");
ImageIO.write(rotatedImg, "png", outputfile);
log.info("END TEST1 " + new Timestamp(System.currentTimeMillis()));
////////////METHOD 2 - WRITE/READ IMAGE FROM FILE
log.info("START TEST2 " + new Timestamp(System.currentTimeMillis()));
writeImageStringToFile(jsonObj.getString("LabelImages"), orderId);
BufferedImage rotatedImg2 = rotate(ImageIO.read(new
File("/var/opt/DI/tmp/label" + orderId + ".png")), 90);
File outputfile2 = new
File("/var/opt/openbravo/bluecrest/DI/tmp/rotatedlabel" + orderId + ".png");
ImageIO.write(rotatedImg2, "png", outputfile2);
log.info("END TEST2 " + new Timestamp(System.currentTimeMillis()));
METHOD 2 is about 10% faster than METHOD 1.
【问题讨论】: