차근차근/JAVA JSP

java , 안드 이미지 dpi변경

예쁜꽃이피었으면 2014. 12. 29. 15:53

글을 어디에 써야할지 몰라서 일단 java에 쓴다.

음.. 하이브리드 앱 수정중이고.

핸드폰에서 얻은 이미지를(찍거나 이미 찍어둔) 서버에 load할 때

96dpi에서 240dpi로 변경해야 한다.


일단 자료 조사..





http://yangga.me/m/post/6

jpeg DPI 변경


"신분증 스캐너" 앱 개발 도중 이미지의 DPI 변경 이슈가 있어 이것저것 R&D를 하였다.


이미지의 Metadata (Exif) 를 수정하면 될 것 같은데, read 가 가능한 코드는 많지만 write가 가능한 코드는 없었다.

(하나 발견하였는데 믿음이 안가서 pass)


여러 글을 읽어보니 ImageMagick을 사용하면 되는걸 알게되었으나,

공식 홈페이지에서는 java버전만을 제공할 뿐 Android는 따로 제공하지 않았다. (사용하려면 awt 등 오라클의 lib을 설치해야 하는 것으로 보임)


그래서 찾아낸것이 

https://github.com/puelocesar/android-lib-magick


어떤 착하신분이 ImageMagick을 android에서 사용하기 위하여 jni 로 빌드된 lib 을 사용하는 패키지를 오픈 소스 하셨다. (감사감사)


사용법은 간단하다.

  1. https://github.com/puelocesar/android-lib-magick 링크에서 프로젝트 다운로드
  2. 개발중이 프로젝트에 Import
  3. 사용


        final int ID_PIC_DPI = 200;  // DPI
        ImageInfo i = new ImageInfo("이미지 경로");

        MagickImage m = new MagickImage(i);

        m.setXResolution(ID_PIC_DPI);

        m.setYResolution(ID_PIC_DPI);



        byte blob[] = m.imageToBlob(i);



        FileOutputStream fos = new FileOutputStream(new File(path));

        fos.write(blob);

        fos.close();

주의사항이 있는데,
필자의 경우 armeabi-v7a 옵션을 사용하여 개발중이라, magick프로젝트에 armeabi-v7a폴더를 만들어 그곳에 armeabi에 있는 *.so 파일을 복사해 주어야 했다.





http://www.androidside.com/bbs/board.php?bo_table=b49&wr_id=106110

JPEGImageWriteParam사용




http://babukuma.egloos.com/m/292596

이미지 사이즈 변경

오늘 필요해서 오전에 간단하게 만든 이미지 사이즈 변경 소스
아무 에러체크도 없지만...
조그만 손보면 여기저기서 쓸만 할 듯..

import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;

/**
 * @author 金 度亨
 */
public class JPEGChangeScale {
    public static void changeSize(String inputPath, String outputPath,
            int width, int height) {
        try {
            BufferedImage inBi = ImageIO.read(new File(inputPath));

            if (inBi == null)
                throw new IOException("読み込み時に例外発生. 画像ファイルじゃないとか...");

            // Scale計算
            double scaleWidth = (double) width / (double) inBi.getWidth();
            double scaleHeight = (double) height / (double) inBi.getHeight();
            AffineTransform atf = new AffineTransform();
            atf.setToScale(scaleWidth, scaleHeight);

            float quality = 1;

            // 変換後のファイル
            BufferedImage outBi = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            outBi.createGraphics().drawImage(inBi, atf, null);

            ImageWriter imageWriter = null;
            Iterator imageWriterIterator = ImageIO
                    .getImageWritersByFormatName("jpg");
            if (imageWriterIterator.hasNext()) {
                imageWriter = (ImageWriter) imageWriterIterator.next();
            }
            if (imageWriter == null) {
                System.err.println("JPEGImageWriter not found.");
                System.exit(1);
            }
            ImageOutputStream ios = ImageIO.createImageOutputStream(new File(
                    outputPath));
            imageWriter.setOutput(ios);
            IIOImage iioImage = new IIOImage(outBi, null, null);
            ImageWriteParam iwp = new JPEGImageWriteParam(null);
            iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            iwp.setCompressionQuality(quality);
            imageWriter.write(null, iioImage, iwp);
            ios.close(); // finallyで書くのマンドクセ('A`)
            imageWriter.dispose();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

반응형