ファイルに保存されたイメージデータの縮小・グレースケール化を 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)
---
