글을 어디에 써야할지 몰라서 일단 java에 쓴다.
음.. 하이브리드 앱 수정중이고.
핸드폰에서 얻은 이미지를(찍거나 이미 찍어둔) 서버에 load할 때
96dpi에서 240dpi로 변경해야 한다.
일단 자료 조사..
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 을 사용하는 패키지를 오픈 소스 하셨다. (감사감사)
사용법은 간단하다.
- https://github.com/puelocesar/android-lib-magick 링크에서 프로젝트 다운로드
- 개발중이 프로젝트에 Import
- 사용
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();
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();
}
}
}
'차근차근 > JAVA JSP' 카테고리의 다른 글
지오로케이션 사용하기 geolocation (0) | 2015.01.06 |
---|---|
exif 디지털카메라로 찍은 jpeg 사진 meta정보 추출하기 - 2005년글 (0) | 2014.12.29 |
[JAVA] 폴더 내 파일과 폴더 안 폴더(하위폴더)의 파일까지 출력하기 (0) | 2014.11.20 |
세션에 데이터 저장했다가 보여주기 (0) | 2014.11.12 |
컬렉션 Collection (0) | 2014.11.11 |