龙空技术网

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

IT宇哥 177

前言:

而今兄弟们对“为什么java的图片显示不了”都比较关注,兄弟们都需要剖析一些“为什么java的图片显示不了”的相关内容。那么小编也在网上汇集了一些有关“为什么java的图片显示不了””的相关知识,希望朋友们能喜欢,同学们一起来学习一下吧!

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

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

技术路线选择

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

java生成图片使用的是Graphics2D进行图片绘制。

遇到的问题

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

想要实现在效果如下图,图片旋转指定角度:

使用的代码如下:

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);

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

解决问题的过程

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

 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,见下图.

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

image.png

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

最后将技术路线改为:

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

结语

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

标签: #为什么java的图片显示不了