티스토리 뷰

반응형

이미지 파일을 파라미터로 받아 destination(저장할 폴더의 디렉터리)에 압축된 이미지를 저장하는 소스입니다.

public static void compressImage(File imageFile, String destination) throws Exception {
    File compressedImageFile = new File(destination + imageFile.getName());

    InputStream is = new FileInputStream(imageFile);
    OutputStream os = new FileOutputStream(compressedImageFile);

    float quality = 0.5f;

    BufferedImage image = ImageIO.read(is);
    Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");

    if (!writers.hasNext())
        throw new IllegalStateException("No writers found");

    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);
    is.close();
    os.close();
    ios.close();
    writer.dispose();

}

BufferedImage는 기본 자바에서 제공하는 함수로 자세한 설명은 아래에 있습니다.

www.tutorialspoint.com/java_dip/java_buffered_image.htm

 

Java BufferedImage Class - Tutorialspoint

Java BufferedImage Class Java BufferedImage class is a subclass of Image class. It is used to handle and manipulate the image data. A BufferedImage is made of ColorModel of image data. All BufferedImage objects have an upper left corner coordinate of (0, 0

www.tutorialspoint.com

 

여기에서 quality는 이미지 퀄리티를 의미하는 값이고 0~1 사이의 값을 가지게 됩니다.

0에 가까워질수록 압축률이 높아져 용량이 감소하는 효과가 있습니다.  

 

만일 이미지의 파일 크기가 전부 다른 경우에 특정 이미지 크기로 압축을 하는 경우 위에 연산로직을 추가하면 될 것입니다. 

아니면 아래와 같은 소스를 사용해도 됩니다.

private static final int ABSOLUTE_WIDTH = 300;
private static final int ABSOLUTE_HEIGHT = 400;

public static void imageResize(File srcFile, String destination)
        throws IOException {

    File destFolder = new File(destination);

    if (!destFolder.exists()) {
        destFolder.mkdirs();
    }

    BufferedImage originalImage = ImageIO.read(srcFile);
    int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
    BufferedImage resizeImage = resizeImageWithHint(originalImage, type);

    ImageIO.write(resizeImage,
            StringUtils.getFilenameExtension(srcFile.getPath()),
            new File(destination + srcFile.getName()));
}

private static BufferedImage resizeImageWithHint(BufferedImage originalImage, int type) {

    BufferedImage resizedImage = new BufferedImage(ABSOLUTE_WIDTH, ABSOLUTE_HEIGHT, type);
    Graphics2D graphics2D = resizedImage.createGraphics();
    graphics2D.drawImage(originalImage, 0, 0, ABSOLUTE_WIDTH, ABSOLUTE_HEIGHT, null);
    graphics2D.dispose();
    graphics2D.setComposite(AlphaComposite.Src);

    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    return resizedImage;
}
반응형
댓글
공지사항