在不同上下文中运行的相同代码会产生不同的结果

时间:2017-06-10 17:17:18

标签: java unit-testing graphics

我编写的代码可以生成png图像并减少html代码的别名。

当我在我的api端点上运行时,我没有在单元测试中获得相同的结果

@Test
public void createImage2() throws Exception{
    String fileNamePng = "createImage2_"+String.valueOf(System.currentTimeMillis() + ".png");

    File image = new File("/tmp/img/"+ fileNamePng);
    HtmlImageGenerator htmlImageGenerator = new HtmlImageGenerator();
    htmlImageGenerator.loadHtml(svg);
    htmlImageGenerator.saveAsImage(image);

    BufferedImage sourceImage = ImageIO.read(image);
    Graphics g = sourceImage.getGraphics();

    Graphics2D g2d = (Graphics2D) g;

    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

    ImageIO.write(sourceImage,"png",image);
}

结果是/大小是7.8Kb enter image description here

在我的api端点

}else if(svg.startsWith("<div")){

       File image = new File("/tmp/"+fileName);
       HtmlImageGenerator htmlImageGenerator = new HtmlImageGenerator();
       htmlImageGenerator.loadHtml(svg);
       htmlImageGenerator.saveAsImage(image);

       BufferedImage sourceImage = ImageIO.read(image);
       Graphics g = sourceImage.getGraphics();

       Graphics2D g2d = (Graphics2D) g;

       g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
       g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

       ImageIO.write(sourceImage,"png",image);

       Files.copy(image.toPath(), response.getOutputStream());
       Files.delete(image.toPath());
   }

    response.flushBuffer();

结果是:/大小为3kb

enter image description here

它看起来好像所有部分gd2图形都没有应用但我可以在我的tmp文件中看到,当调试器在这些行中时,日期&#34;修改在&#34;改变了。

输入中的svg / html代码与api端点和单元测试相同。 (我检查了haschode)

修改1:

我使用了Scalr:

              }else if(svg.startsWith("<div")){

       System.out.println(svg.hashCode());

       File image = new File("/tmp/"+fileName);
       HtmlImageGenerator htmlImageGenerator = new HtmlImageGenerator();
       htmlImageGenerator.loadHtml(svg);
       height = (int) htmlImageGenerator.getSize().getHeight();
       width = (int) htmlImageGenerator.getSize().getWidth();

       BufferedImage test3 = Scalr.apply(htmlImageGenerator.getBufferedImage(),Scalr.OP_ANTIALIAS);

       ImageIO.write(test3,"png",image);

       Files.copy(image.toPath(), response.getOutputStream());
   }

    response.flushBuffer();

结果是/大小是4.97 Kb enter image description here

看起来像scalr doc中描述的模糊(来自scalr的抗锯齿更像是低模糊效果)

1 个答案:

答案 0 :(得分:1)

从Java 2D图形教程中查看Controlling Rendering Quality可能是值得的。总而言之,不保证在所有Java平台上都应用渲染提示。

在运行单元测试的平台上,支持并正在应用这些提示。在API端点上,很明显没有应用抗锯齿,但文件仍然正确写入磁盘。

由于插值和抗锯齿设置会影响生成的图像,因此图像的大小也会受到影响。

如果您需要应用这些,您可以:

  1. 使用其他图像处理库。 What is the best Java image processing library approach?可能会引起人们的兴趣。
  2. 将您的API端点切换为另一种Java实现。