ラベル imaging の投稿を表示しています。 すべての投稿を表示
ラベル imaging の投稿を表示しています。 すべての投稿を表示

2014年9月4日木曜日

Javaで画像ファイルをリサイズしたい場合はBufferedImageとGraphics2Dを使う

Javaで画像ファイルをリサイズしたい場合はBufferedImageとGraphics2Dを使う。

http://www.mkyong.com/java/how-to-resize-an-image-in-java/


BufferedImage originalImage = null;
BufferedImage resizedImage = null;
Graphics2D g = null;
try {
int width = 200;
int height = 200;

originalImage = ImageIO.read(originalFile);
int type = originalImage.getType() == 0 
? BufferedImage.TYPE_INT_ARGB : originalImage.getType();

resizedImage = new BufferedImage(width, height, type);
g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, width, height, null);
g.dispose();

ImageIO.write(resizedImage, "jpg", 
new File(imageFolder.getAbsolutePath()+"/"+iconName));

// post process
if( originalImage != null ) {
originalImage.flush();
originalImage = null;
}

// post process
if( resizedImage != null ) {
resizedImage.flush();
resizedImage = null;
}
 
} catch(Exception e) {
System.out.println("Can not generate " + originalFile.getName());
e.printStackTrace();
} finally {
if( originalImage != null ) {
originalImage.flush();
originalImage = null;
}
if( resizedImage != null ) {
resizedImage.flush();
resizedImage = null;
}
}

ImageIO.readeで java.lang.OutOfMemoryの例外が発生する場合に注意しておく点

ImageIO.readeで java.lang.OutOfMemoryの例外が発生する場合、以下の点に注意する。


  1. VMの-Xmxを充分な値に設定しているかどうか。
  2. BufferedImageを使用後にflushやnullを設定するなどの後処理をしているか。(特にファイルを連続で読み込んだりする場合は注意。)

画像のエンコーディングをJavaで検知するには?

ImageIO.getImageReadersを使う。
ImageInputStream imageInputStream = ImageIO.createImageInputStream(
    myInputStream);
Iterator<ImageReader> iter = ImageIO.getImageReaders(imageInputStream);
if (!iter.hasNext()) {
    // this always happens
}
ImageReader reader = (ImageReader) iter.next();
if (!reader.getFormatName().equals("jpeg")) {

}
http://stackoverflow.com/questions/4530348/detecting-image-encoding-in-java