- 浏览: 525810 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
飞天奔月:
public List<String> gener ...
实践中的重构30_不做油漆匠 -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道public class A {
...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在世界的中心呼喚愛 写道在classB ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在classB的finalize上打断 ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
iteye比较少上,如果可以的话,可以发e-mail交流:ch ...
深入理解ReferenceQueue GC finalize Reference
目前加载一个png格式的图片,做一些绘图工作,发现ImageIO.write存储png性能较差,转为存储jpg格式图片,性能可以提高6,7倍。
代码如下。
代码如下。
package test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import java.util.Iterator; import javax.imageio.*; import javax.imageio.stream.*; import org.junit.Before; import org.junit.Test; /** * 加载png格式图片,使用不同方式转为png或者jpg格式的性能对比。 * */ public class PngJpgImagePerTest { private static String PNG = "png"; private static String JPG = "jpg"; private static String SimpleSavePNG = "__SimpleSavePNG.png"; private static String Convert2ArrayAndSavePNG = "__Convert2ArrayAndSavePNG.png"; private static String NewImageSavePNG = "__NewPNG.png"; private static String NewImageSaveJPG = "__NewJPG.jpg"; private static String SaveJPG = "__JPG_quality.jpg"; /** * 保存文件。 * */ public static void save2File(String filePath, byte[] data) { BufferedOutputStream bufferOutput = null; try { bufferOutput = new BufferedOutputStream(new FileOutputStream( new File(filePath)), 1024); bufferOutput.write(data); bufferOutput.flush(); } catch (Exception e) { throw new RuntimeException(e); } finally { if (bufferOutput != null) { try { bufferOutput.close(); } catch (Exception e) { throw new RuntimeException(e); } } } } /** * load image * */ public static BufferedImage loadImage(String filePath) { try { return ImageIO.read(new File(filePath)); } catch (Exception e) { throw new RuntimeException(e); } } /** * simple save use ImageIO.write */ public static void saveImage(BufferedImage image, String format, String filePath) { try { ImageIO.write(image, format, new File(filePath)); } catch (Exception e) { throw new RuntimeException(e); } } /** * convert to byte array. * */ public static byte[] convert2bytes(BufferedImage image, String format) { try { ByteArrayOutputStream bout = new ByteArrayOutputStream(1024); ImageIO.write(image, format, bout); byte[] data = bout.toByteArray(); return data; } catch (Exception e) { throw new RuntimeException(e); } } /** * create new buffer image and save using png format. * */ public static void savePngImage(BufferedImage image, String format, String filePath) { BufferedImage bufferedImage = new BufferedImage(image.getWidth(), image .getHeight(), BufferedImage.TYPE_3BYTE_BGR); bufferedImage.getGraphics().drawImage(image, 0, 0, null); saveImage(bufferedImage, PNG, filePath); } /** * create new buffer image and save using jpg format. * */ public static void saveJpgImage(BufferedImage image, String format, String filePath) { BufferedImage bufferedImage = new BufferedImage(image.getWidth(), image .getHeight(), BufferedImage.TYPE_3BYTE_BGR); bufferedImage.getGraphics().drawImage(image, 0, 0, null); saveImage(bufferedImage, JPG, filePath); } /** * save jpg with specified quality. 为了图片质量,quality的值不能太低。 * */ public static void saveImageUsingJPGWithQuality(BufferedImage image, String filePath, float quality) throws Exception { BufferedImage newBufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); newBufferedImage.getGraphics().drawImage(image, 0, 0, null); Iterator<ImageWriter> iter = ImageIO .getImageWritersByFormatName("jpeg"); ImageWriter imageWriter = iter.next(); ImageWriteParam iwp = imageWriter.getDefaultWriteParam(); iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); iwp.setCompressionQuality(quality); File file = new File(filePath); FileImageOutputStream fileImageOutput = new FileImageOutputStream(file); imageWriter.setOutput(fileImageOutput); IIOImage iio_image = new IIOImage(newBufferedImage, null, null); imageWriter.write(null, iio_image, iwp); imageWriter.dispose(); } public static void drawString(Graphics2D g2, String value, int x, int y) { Font font = new Font("Arial", Font.BOLD, 16); g2.setColor(Color.BLACK); g2.setFont(font); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2.drawString(value, x, y); } private String sourceFilePath; private BufferedImage sourceImage; private int loop; private float quality; @Before public void setup() { sourceFilePath = "E:\\allencode\\ImgTest\\stat.png"; sourceImage = loadImage(sourceFilePath); loop = 10; quality = 0.8F; Graphics2D g2 = sourceImage.createGraphics(); draw(g2); } private void draw(Graphics2D g2) { drawString(g2, "Allen Hello world.", 500, 200); } /** * ImageIO.write存储图片时主要的性能消耗在计算上。 * */ @Test public void test_01() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < loop; i++) { long start = System.currentTimeMillis(); saveImage(sourceImage, PNG, sourceFilePath + SimpleSavePNG); long end = System.currentTimeMillis(); sb.append(" saveImage = " + (end - start)); long convertStart = System.currentTimeMillis(); byte[] pngData = convert2bytes(sourceImage, PNG); long convertEnd = System.currentTimeMillis(); sb.append(" convert = " + (convertEnd - convertStart)); long saveStart = System.currentTimeMillis(); save2File(sourceFilePath + Convert2ArrayAndSavePNG, pngData); long saveEnd = System.currentTimeMillis(); sb.append(" save = " + (saveEnd - saveStart)); sb.append("\n"); } System.out.println(sb); } /** * ImageIO.write和新建一个BufferedImage,采用jpg或png保存的比较。 * */ @Test public void test_02() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < loop; i++) { long start = System.currentTimeMillis(); saveImage(sourceImage, PNG, sourceFilePath + SimpleSavePNG); long end = System.currentTimeMillis(); sb.append(" saveImage = " + (end - start)); start = System.currentTimeMillis(); savePngImage(sourceImage, "png", sourceFilePath + NewImageSavePNG); end = System.currentTimeMillis(); sb.append(" savePngImage = " + (end - start)); start = System.currentTimeMillis(); saveJpgImage(sourceImage, "jpg", sourceFilePath + NewImageSaveJPG); end = System.currentTimeMillis(); sb.append(" saveJpgImage = " + (end - start)); sb.append("\n"); } System.out.println(sb); } /** * ImageIO.write存储图片和保存jpg的时间对比。 * */ @Test public void test_03() throws Exception { StringBuilder sb = new StringBuilder(); for (int i = 0; i < loop; i++) { long pngStart = System.currentTimeMillis(); saveImage(sourceImage, PNG, sourceFilePath + SimpleSavePNG); long pngEnd = System.currentTimeMillis(); sb.append(" saveImage = " + (pngEnd - pngStart)); long jpgStart = System.currentTimeMillis(); saveImageUsingJPGWithQuality(sourceImage, sourceFilePath + SaveJPG, quality); long jpgEnd = System.currentTimeMillis(); sb.append(" JPGWithQuality = " + (jpgEnd - jpgStart)); sb.append(" % = " + (pngEnd - pngStart) * 1D / (jpgEnd - jpgStart)); sb.append("\n"); } System.out.println(sb); } }
发表评论
-
java对象的大小_基础知识
2014-09-14 16:51 1731引言 Java的对象被jvm管理,单个对象如何布局,大小如何, ... -
xml encoding和实际编码不同导致xml解析异常
2014-04-10 09:52 4976发现一个xml encoding和实际编码不同导致xml解析异 ... -
按照bit读取或写入java的IO流
2012-11-18 22:00 3766写了个按照bit读取或写入java的IO流的简单代码,保留在博 ... -
类构造函数clinit尽量简单化
2012-01-29 16:30 1386java的类构造方法只能执行一次(不考虑多个类加载器和类卸载的 ... -
GC iCMS一次调优
2011-12-23 20:00 0原有GC参数: -server -XX:+UseParNew ... -
java集合框架类源代码阅读体会(Java Collections Framework)
2011-09-17 23:55 5001忘了什么原因突然想看下JCF,于是就有了这个阅读体会。 jav ... -
[gc] GC调优及awk脚本分析GC日志
2011-07-20 19:26 2094原有GC参数 JAVA_OPTS="-server ... -
jvm性能查看工具
2011-06-18 11:48 1585jps查看所有java进程。 jconsole jvisu ... -
[gc] java内存管理以及GC
2011-03-27 13:25 4431目录 内存管理简介 GC简介 好的Collector的特性 ... -
object的hash code
2011-01-03 19:40 2096sun的jvm默认的hash code返回的是对象的内部地址构 ... -
Enum简介
2010-08-16 21:51 1487java的Enum不同于c的命名整型常量,它本身是有类型的,而 ... -
java1.5中{@inheritDoc}的使用
2010-07-12 23:14 9572java1.5中@Override还不能用 ... -
[code] 大量只读线程安全的FastHashMap
2010-06-25 17:27 2282org.apache.commons.collections. ... -
[code] 继承TableRowSorter的一个小陷阱
2010-01-09 21:54 1264在一个JTable里面想做sorting。 继承了TableR ... -
[code] 多个线程写入,单线程读出的Stream对
2009-11-06 10:38 1707今天想做一个System.out的重定向,想要得的结果是有很多 ... -
深入理解java的finalize
2009-10-11 01:23 19163目录 基本预备相关知 ... -
深入理解java的clone
2009-10-09 14:13 4590目录 预备知识 为什么 ... -
简明OPhone/Android入门体验(有图有源码)
2009-09-25 00:34 3339主要参考 http://code.google.com/p/a ... -
深入理解ReferenceQueue GC finalize Reference
2009-06-22 22:55 20100关于对象如何销毁以及f ...
相关推荐
主要介绍了java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决的相关资料,需要的朋友可以参考下
NULL 博文链接:https://o-oand0-0.iteye.com/blog/1585854
NULL 博文链接:https://zhangmingji.iteye.com/blog/1969693
javax.imageio-1.0.5.jar, java处理图片的库。 从maven中央仓库下载的。实测可用。
做OCR项目时用到的tesseract相关技术工作包,找起来还蛮麻烦的,放在这里给各位技术朋友们免费下载。
java高级图片处理工具 jai-imageio,可以修改图片分辨率等
com.sun.media.imageio.plugins.tiff.TIFFImageWritePar 报错,很多同学找不到 这个jai_imageio-1.1-alpha.jar 提供下下载
ImageIo.dll提供了图片处理、格式转换的程序接口
webp-imageio-0.4.2.zip 包含:.jar .so/.dll 涵盖linux 32/64 windows 32/64 版本
内含: luciad-webp-imageio-2962dd563583 libwebp-0.4.0.tar.gz cmake-3.1.0-rc2-Linux-i386.tar.gz
imageio.jar .
imageio-2.2.0.tar.gz 解压后安装。./configure ,阅读readme。
jai_codec-1.1.3.jar jai_core.jar jai_imageio.jar jimi-1.0.jar
imageio的下载资源,下载之后通过python直接安装到环境就可以使用了
Exception in thread “main” javax.imageio.IIOException: Can’t read input file!:无法读取输入文件! 原可以从两个方面分析: 路径中文乱码问题 target/classes文件夹中并没有找到图片 加粗样式看下代码: ...
3个jar包: jai_core-1.1.3.jar jai_imageio.jar jai-codec-1.1.3.jar
TwelveMonkeys, TwelveMonkeys ImageIO 最新版本主分支生成状态: 最新版本是 TwelveMonkeys ImageIO 3.3.2 ( Feb ) 。 2年,2017年,发行说明。TwelveMonkeys ImageIO是 java ImageIO的插件和扩展的C
java环境下生成webp文件所用到的库,libwebp-imageio.so for Linux,webp-imageio.dll for Windows,webp-imageio-1.0.0.jar for java project。项目文件:https://bitbucket.org/luciad/webp-imageio
描述用于图像格式的读取器和写入器。执照webp-imageio 在版本 2.0 下分发。用法将 webp-imageio.jar 添加到应用程序的类路径确保 libwebp-imageio.so、libwebp-imageio.dylib 或 webp-imageio.dll 可在 Java 本机库...