2017-06-10 35 views
1

我已经编写了生成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文件中看到,当调试器在这些行中时,“修改的日期”被更改。

输入中的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文档描述等所迷离(从scalr反锯齿更像是一个低模糊效果)

回答

1

这可能是值得看看Controlling Rendering Quality来自Java 2D图形教程。总而言之,渲染提示并不保证适用于所有Java平台。

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

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

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

  1. 使用不同的图像处理库。 What is the best Java image processing library approach?可能是有趣的。
  2. 将您的API端点切换到不同的Java实现。
+0

好吧,我用弹簧。我刚刚读到,Spring实现了一些JavaEE,但替换了一些部分,但graphics2d是来自Java SE否? 。我要尝试从给定的链接 –

+0

scalr,我不能改变我的API实现 –

相关问题