본문 바로가기

Start

java 이미지 리사이징 해상도변경 픽셀변경

반응형

 

이미지 용량, 사이즈 줄이는 법은

해상도를 줄이는 방법과 픽셀을 줄여 품질을 저하시키는 방법이 있다.

 

그 두가지 방법은 아래 소스 함수 두개로 나눠져 있다.

 

import java.awt.image.BufferedImage;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputstream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
improt javax.imageio.ImageWriteParam; 
import javax.imageio.ImageWriter, javax.imageio.stream.ImageOutputstream;

//품질저하로 용량줄이기
 public static boolean mmsQuality(File resImg, File dest)
 	throws IOException{
 
 	float quality = 0.9f; //퀄리티 설정 0.1~1.0까지 압축지정. 숫자가 낮을 수록 화질과 용량이 줄어듬.
    float deQuality = 0.1f;
    float maxQuality = 0.9f;
    float minQuality = 0.1f;
   
	OutputStream os = new FileOutputstream(dest); 
    BufferedImage image = ImageI0.read(resImg); // Image 읽어들임
    Iterator writers= ImageIO.getImageWritersByFormatName("jpg");
    
 	while(fileSize.length() > 307200){ 
    	if(quality != maxQuality) {
        	image = ImageI0.read(dest); // 변환한 이미지로 변경
            writers = ImageI0.getImageWritersByFormatName("jpg"); 
            os = new FileOutputStream(dest);
        }
        
        ImageWriter writer = (ImageWriter)writers.next();
        ImageOutputstream ios = ImageIO.createImageOutputStream(os); 
        writer.setOutput(ios);
        ImageWriteParam param = writer.getDefaultWriteParam();
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
        param.setCompressionQuality(quality);
        writer.write(null, new IIOImage(image,null,null),param);
        ios.close(); writer.dispose(); os.close();

        fileSize = dest; 
 
         if(fileSize.length() -> 307200) { 
            quality - quality - deQuality;
            if(minQuality >= quality) {//최소 휠리티까지 떨어졌는데도 안되면 false 
                returnVal false;
                break;
             }
         }else{ 
            returnVal = true;
         }
 	}
 	return returnVal;
 }
    
    

//해당이미지 크기 변경
public static boolean mmsResizeOrg(File-resImg, File dest, int thumb_len) 
	throws IOException{

 boolean returnVal = false;
 
 BufferedImage srcImg = ImageIO.read(resimg);
 int srcWidth = srcImg.getWidth();
 int srcHeight = srcImg.getHeight();
 
 int destWidth = -1;
 int destHeight = -1;
 
 if (srcWidth > 999 || srcHeight > 999){
  if (srcWidth > srcHeight || srcwidth == srcHeight){
  	destWidth = thumblllen;
    destHeight = (int)((double) srcHeight * thumb_len/srcWidth); 
   }else{ 
   	destWidth = (int) ((double) srcWidth * thumb_len/srcHeight); 
    destHeight = thumb_len;
   }
   // Image Size 변경
   BufferedImage destImg = new BufferedImage(destwidth, destHeight, BufferedImage.TYPE_3BYTE_BGR);
   Graphics2D g = destImg.createGraphics();
   g.drawImage(srcImg,-0, 0, destWidth, destHeight, null);
   
   ImageIO.write(destImg,"jpg",dest);
   returnVal = true;
  }else{
  	returnVal = false;
  }
  return returnVal;
}

 

사이즈를 엄청 줄여야 하는 경우라면 물리적 사이즈를 먼저 줄이고

원하는 용량까지 줄어들도록 퀄리티를 낮추면 수월하게 사용할 수 있을 것이다.

 

 

 

 

 

 

반응형