필자는이 문제를 JpegCodec, ImageIO (매개 변수 없음), ImageIO (매개 변수 포함)로 인코딩 및 쓰기의 차이점을 측정하기 위해 테스트했습니다.
int numTest = 200;
Robot robot = new Robot();
BufferedImage image = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
//JPEGCODEC
long t1 = System.currentTimeMillis();
ByteArrayOutputStream ba = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(ba);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(0.75f, false);
encoder.setJPEGEncodeParam(param);
File f = new File("TestJPEGCODEC");
f.mkdir();
for (int i = 0; i < numTest; i++) {
encoder.encode(image);
f = new File("TestJPEGCODEC\\test" + i + ".jpg");
FileOutputStream fo = new FileOutputStream(f);
fo.write(ba.toByteArray());
fo.flush();
ba.reset();
}
long t2 = System.currentTimeMillis();
System.out.println("JPEGCODEC");
System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1)/numTest);
//NORMAL IMAGEIO
t1 = System.currentTimeMillis();
f = new File("TestImageIO");
f.mkdir();
for (int i = 0; i < numTest; i++) {
f = new File("TestImageIO\\test" + i + ".jpg");
ImageIO.write(image, "jpg", f);
}
t2 = System.currentTimeMillis();
System.out.println("ImageIO");
System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1)/numTest);
Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = null;
while (it.hasNext()) {
writer = it.next();
}
//IMAGEIO EXPLICIT MODE
t1 = System.currentTimeMillis();
ImageWriteParam par = writer.getDefaultWriteParam();
par.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
par.setCompressionQuality(0.75f);
f = new File("TestImageIOExplicity");
f.mkdir();
for (int i = 0; i < numTest; i++) {
f = new File("TestImageIOExplicity\\test" + i + ".jpg");
FileImageOutputStream output = new FileImageOutputStream(f);
writer.setOutput(output);
IIOImage img = new IIOImage(image, null, null);
writer.write(null, img, par);
output.close();
}
t2 = System.currentTimeMillis();
writer.dispose();
System.out.println("IMAGEIOPAR");
System.out.println("Total time:: " + (t2 - t1) + " average time:: " + (t2 - t1)/numTest);
위의 코드는 내 결과 테스트가 ms입니다.
JPEGCODEC
Total time:: 13750 average time:: 68
ImageIO
Total time:: 38906 average time:: 194
IMAGEIOPAR
Total time:: 43078 average time:: 215
나는 내가 com.sun.image.codec.jpeg.JPEGCodec를 사용 should't 것을 알고 있지만, 결과 이런 종류의, 그것은 unbearable.In JPG를 작성/인코딩 ImageIO에서의 사용을 만들어 내 현재 프로젝트에서 평균 인코딩 및 쓰기의 차이가 너무 커서 JPEGCODEC을 사용해야하거나 동일한 효과를 위해 다른 외부 라이브러리를 사용해야합니다.
출처
2012-05-18 18:56:17
sja
입력 해 주셔서 감사합니다. 제 경우에는 성능 차이가 처리량/처리 빈도에 영향을 미치지 않았습니다. – Peter