ファイルに保存されたイメージデータの縮小・グレースケール化を Java で行う機会があったので,ImageIO パッケージ を使ってみました。
イメージファイルの読み込みは非常に簡単で,ImageIO.read
メソッドを呼び出すだけです。読み込み後は,幅や高さを取得することが出来ます。
String filePath = "test.jpg"; File imageFile = new File(filePath); BufferedImage image = ImageIO.read(imageFile); int width = image.getWidth(); int height = image.getHeight();
読み込んだイメージデータの縮小には,AffineTransformOp
を利用します。今回使用した J2SE 1.4.2 では,補間方法としてバイリニアとニアレストネイバーしか用意されていないため,あまりキレイな画像を得られませんでした。J2SE 1.5.0 からは補間方法としてバイキュービックが追加されたようなので,よりキレイな画像を得られるはずです。ちなみに率の計算が異なるだけでイメージデータの拡大も同じです。
// 縦横の縮小率を計算して,小さい方を縮小率とする // (縦横比を維持するため) double ratio = Math.min( (double)newWidth / (double)width, (double)newHeight / (double)height); int shrinkedWidth = (int)(width * ratio); int shrinkedHeight = (int)(height * ratio); // イメージデータを縮小する BufferedImage tmpImage = new BufferedImage( shrinkedWidth, shrinkedHeight, image.getType()); AffineTransformOp atOp = new AffineTransformOp( AffineTransform.getScaleInstance(ratio, ratio), AffineTransformOp.TYPE_BILINEAR); atOp.filter(image, tmpImage);
イメージデータのグレースケール化には,ColorConvertOp
を利用します。
BufferedImage tmpImage = new BufferedImage( width, height, image.getType()); ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp ccOp = new ColorConvertOp(cs, null); ccOp.filter(image, tmpImage);
イメージデータの書き出しも読み込みと同様簡単で,出力フォーマットに対応した ImageWriter
を取得して書き出すだけです。なお,GIF 用の ImageWriter
は用意されていないようなので,JPEG か PNG で書き出すことになります。
String dstFilePath = "test2.jpg"; Iterator writers = ImageIO.getImageWritersBySuffix("jpg"); ImageWriter writer = (ImageWriter)writers.next(); File imageFile = new Flie(dstFilePath); ImageOutputStream os = ImageIO.createImageOutputStream(imageFile); writer.setOutput(os); writer.write(image);
> GIF 用の ImageWriter は用意されていないようなので,JPEG か PNG で書き出すことになります。
gif-pluginや、FreeHEP Java Library 1.2.2というプラグインを入れると、
GIFで書き出せます。
---
・gif-plugin(ライセンス:Apache2.0)
・FreeHEP Java Library 1.2.2(ライセンス:LGPL)
---