ImageIOでjpeg φ(. . )

2007-03-26の私的うたわれツールで流石にbitmapだと切り出した後サイズがでっかいので、つか変わらないんでjpegに変換することに。
前に画像縮小したりするツール作ったりしたのにすぐ忘れたりするもんだから、ここに簡単にまとめを。

// bitmapを読み込む
BufferedImage src = ImageIO.read(new File("C:/test.bmp"));
// jpegで保存
boolean b = ImageIO.write(src, "jpg", new File("C:/test.jpg"));

とこれでさくっと変換は可能。
出力対応してるのはbmp, jpg, pngあたり。詳しくはJavadocでよろw
ただjpegの画質やら圧縮率とかはデフォルト(環境依存?)らしく、正直微妙に。
こーなると自前で設定するわけで。
で、やるのはGraphics2Dを使ってRenderingHintsを指定してBufferedImageに描画。
その新しく描画したのをImageWriterを使って出力と。

int width = 320;
int height = 240;
BufferedImage src = ImageIO.read(new File("C:/test.bmp"));
BufferedImage dest = new BufferedImage(width, height, src.getType());
Graphics2D g2d = dest.createGraphics();
// 描画設定をいろいろと
g2d.setRenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(src, 0, 0, width, height, null);

ここで設定できるヒントてのがJavadocを見ると

RenderingHints.Key Value
KEY_ALPHA_INTERPOLATION VALUE_ALPHA_INTERPOLATION_DEFAULT

VALUE_ALPHA_INTERPOLATION_QUALITY

VALUE_ALPHA_INTERPOLATION_SPEED
KEY_ANTIALIASING VALUE_ANTIALIAS_DEFAULT

VALUE_ANTIALIAS_OFF

VALUE_ANTIALIAS_ON
KEY_COLOR_RENDERING VALUE_COLOR_RENDER_DEFAULT

VALUE_COLOR_RENDER_QUALITY

VALUE_COLOR_RENDER_SPEED
KEY_DITHERING VALUE_DITHER_DEFAULT

VALUE_DITHER_DISABLE

VALUE_DITHER_ENABLE
KEY_FRACTIONALMETRICS VALUE_FRACTIONALMETRICS_DEFAULT

VALUE_FRACTIONALMETRICS_OFF

VALUE_FRACTIONALMETRICS_ON
KEY_INTERPOLATION VALUE_INTERPOLATION_BICUBIC

VALUE_INTERPOLATION_BILINEAR

VALUE_INTERPOLATION_NEAREST_NEIGHBOR
KEY_RENDERING VALUE_RENDER_DEFAULT

VALUE_RENDER_QUALITY

VALUE_RENDER_SPEED
KEY_STROKE_CONTROL VALUE_STROKE_DEFAULT

VALUE_STROKE_NORMALIZE

VALUE_STROKE_PURE
KEY_TEXT_ANTIALIASING VALUE_TEXT_ANTIALIAS_DEFAULT

VALUE_TEXT_ANTIALIAS_GASP

VALUE_TEXT_ANTIALIAS_OFF

VALUE_TEXT_ANTIALIAS_ON
KEY_TEXT_LCD_CONTRAST VALUE_TEXT_ANTIALIAS_LCD_HBGR

VALUE_TEXT_ANTIALIAS_LCD_HRGB

VALUE_TEXT_ANTIALIAS_LCD_VBGR

VALUE_TEXT_ANTIALIAS_LCD_VRGB

アンチエリアスのValueがちと怪しいけど、こんだけいろいろあるっぽい。
これを必要に応じて設定すると。
BufferedImageに描画したのをファイルに書き出すにはImageWriterを使えばOK。
ただImageWriterは出力形式にあわせた物で。
jpegならJPEGImageWriteParamに品質設定もわすれずに。

JPEGImageWriteParam jiparam = new JPEGImageWriteParam(Locale.getDefault());
jiparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
jiparam.setCompressionQuality(0.9f);
ImageWriter iw = ImageIO.getImageWritersByFormatName("jpg").next();
iw.setOutput(ImageIO.createImageOutputStream(new File("C:/test.jpg")));
iw.write(null, new IIOImage(dest, null, null), jiparam);


超個人的メモは以上。