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

댓글 없음:

댓글 쓰기