前言:
而今兄弟们对“为什么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图片,结果非常满意,图片放大后无明显锯齿,如图:
可以看到图片边缘有明显的过渡,正常大小显示时边缘非常光滑。
最后将技术路线改为:
使用batik.svg库将 Graphics2D生成为svg文件,然后使用 lnkscape的命令行模式将svg转换成png图片
结语
本方案也有些缺点,使用lnkscape转换性能上会有损失,朋友们有更好的方案,欢迎讨论。
标签: #为什么java的图片显示不了