2011년 5월 18일 수요일
[JAVA] JAI 와 JIU를 혼용하여 이미지를 빠르고 품질높게 크기 변환하기
오호... 이것땜에 한참 고생했네..
이미지 로딩부분은 JAI 를 사용하고..
변환은 java 의 그래픽기능을 이용하고
저장은 JIU 를 이용한다.
/**
* filename : Test.java
* package : ewha.say.server.image
* comment :
* author : cozysoul
* date : 2007. 11. 27
*/
package ewha.say.server.image;
import ewha.say.server.util.ImageUtil;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import net.sourceforge.jiu.codecs.CodecMode;
import net.sourceforge.jiu.codecs.ImageCodec;
import net.sourceforge.jiu.codecs.PNGCodec;
import net.sourceforge.jiu.data.PixelImage;
import net.sourceforge.jiu.gui.awt.BufferedRGB24Image;
public class Test {
public static void main(String[] args) {
long sTime = System.currentTimeMillis();
new Test().pngReduceOriScale("E:/Backup/kim.jpg", "E:/Backup/kim.png", 232, 192);
long eTime = System.currentTimeMillis();
System.out.println("-->" + (eTime - sTime));
sTime = System.currentTimeMillis();
new Test().pngReduceOriScale("E:/Backup/flower.jpg", "E:/Backup/flower.png", 232, 192);
eTime = System.currentTimeMillis();
System.out.println("-->" + (eTime - sTime));
}
/**
* 원본이미지를 지정된 사이즈로 스케일에 맞게 변환한다.
* JAI 와 JIU를 혼용하여 속도를 빠르고 품질을 올려 변환수행
* @param oriFile 원본파일경로
* @param newFile 생성될 파일경로
* @param width width 최대크기
* @param height height 최대크기
* @return 변환여부
*/
public boolean pngReduceOriScale(String oriFile, String newFile, int width, int height) {
boolean result = true;
try {
//이미지 로드
RenderedOp image = JAI.create("fileload", oriFile);
BufferedImage tmp = image.getAsBufferedImage();
//스케일 된 이미지 만들기---------------------------------------------------------
int[] scale = ImageUtil.getScale(width, height, tmp.getWidth(), tmp.getHeight());
Image scaleimage = tmp.getScaledInstance(scale[0], scale[1], 4); // 1:DEFAULT/기본, 2:FAST/성능, 4:SMOOTH/품질
// 생성될 파일의 용량을 고려하여 15bit 로 읽어들여 변환한다.
BufferedImage png24 = ImageUtil.toBufferedImageHints(scaleimage, scale[0], scale[1], BufferedImage.TYPE_USHORT_555_RGB);
PixelImage pi = new BufferedRGB24Image(png24).createCopy();
// PNG 변환 & 파일로 저장
BufferedOutputStream out = new BufferedOutputStream(new ByteArrayOutputStream());
ImageCodec codec = new PNGCodec();
codec.setOutputStream(out);
codec.setImage(pi);
codec.setBounds(0, 0, scale[0] - 1, scale[1] - 1); // 지정하지 않으면 내부적으로 자동지정되어 시간 더 걸림
codec.setFile(newFile, CodecMode.SAVE);
codec.process();
codec.close();
out.close();
}
catch (Exception e) {
result = false;
}
return result;
}
}
public static BufferedImage toBufferedImageHints(Image image, int width, int height, int mode)
{
RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
qualityHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
BufferedImage bufferedImage = new BufferedImage(width, height, mode);
Graphics2D g2d = bufferedImage.createGraphics();
g2d.setRenderingHints(qualityHints);
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return bufferedImage;
}
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기