在线印刷图片生成清晰度问题解决思路

最近在做一个在线图片设计器项目,项目的最终形态见下图(参考),


在线图片设计器效果图

图片设计好后可以生成png图片或都pdf文件进行打印,对图片的清晰度要求较高。

技术路线选择

基本的思路是前端使用svg进行设计器的开发,然后将图片的位置、大小、旋转等前端设计信息回传到后端,后端使用java生成图片。
java生成图片使用的是Graphics2D进行图片绘制。

遇到的问题

使用Graphics2D生成图片时,如果画布中不存在旋转元素,图片的清晰度是没有问题的,但当将一张图片旋转指定角度绘制后,图片元素的边缘将会出现严重的锯齿。
想要实现在效果如下图,图片旋转指定角度:


image.png

使用的代码如下:

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D) bi.getGraphics();
g2.rotate(Math.toRadians(15));
Image image=略;
g2.drawImage(image, 100, 100, 300, 300, Color.white, null);

生成的图片将边缘放大后有很严重的锯齿,见下图:


image.png

解决问题的过程

中间查找资料打上了如下代码:

 g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            g2.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,
                    RenderingHints.VALUE_RENDER_QUALITY));
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

此处代码的参数也调整过好几版,均不能解决这个问题。遂决定更新一下技术路线
先使用itextpdf 将前端传过来的设计信息生成pdf文件,然后使用ImageMagick将pdf文件转换成png, 经过测试问题依旧!

最终解决方案

在google搜索ImageMagick格式转换锯齿问题时,看到国外网友多次提到lnkscape这个软件,立马安装试用,软件本身自带UI,见下图.


image.png

使用软件将一个svg文件转换成png图片,结果非常满意,图片放大后无明显锯齿,如图:


image.png

可以看到图片边缘有明显的过渡,正常大小显示时边缘非常光滑。

最后将技术路线改为:
使用batik.svg库将 Graphics2D生成为svg文件,然后使用 lnkscape的命令行模式将svg转换成png图片

结语

本方案也有些缺点,使用lnkscape转换性能上会有损失,朋友们有更好的方案,欢迎讨论。

你可能感兴趣的:(在线印刷图片生成清晰度问题解决思路)