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);
超個人的メモは以上。