2005年 3月 07日 月曜日 |
今日のAPI: Java Advanced Imaging 〜画像を縮小する〜 English Translation: (Yahoo!) / (Google) Java Advanced Imagingというと最近オープンソース化された話題のAPIです。
Java 2Dよりも対応画像フォーマットが充実していたり、画像に対する専門的な
操作ができるのがこのAPIです。
今日はデジカメでとった写真をWeb素材として使うために縮小(または拡大)するためにJava
Advanced Imagingを使いました。特に今回実現したかったのは、画像の幅や
高さを指定した縮小ではなく、画像の面積に応じた縮小です。面積に応じて変換することで
パノラマ写真やトリミングした写真をサムネイルとして並べたときの印象を合わせることが出来ます。
Java Advanced Imagingの準備
--- プログラム(Resize.java) ----
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.IOException;
import javax.media.jai.Interpolation;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
public class Resize {
/**
* 画像のリサイズ。
* @param pixelCount ドット数
* @param inputName 入力ファイル名
* @param outputName 出力ファイル名
* @param imageType 画像フォーマット。たとえば"JPEG"
* @throws IOException 入出力処理時の例外
*/
public static void resize(long pixelCount, String inputName, String outputName, String imageType) throws IOException {
// 画像ファイルの読み込み
FileSeekableStream stream = new FileSeekableStream(inputName);
RenderedOp image1 = JAI.create("stream", stream);
// 画像の縮小
Interpolation interp = Interpolation.getInstance(Interpolation.INTERP_BICUBIC_2);
// 画像面積および縮小比率の計算
int width = image1.getWidth();
int height = image1.getHeight();
long actualPixelCount = width * height;
double scale = Math.sqrt((double)pixelCount / (double)actualPixelCount);
ParameterBlock params = new ParameterBlock();
params.addSource(image1);
params.add((float)scale);
params.add((float)scale);
params.add(0.0F);
params.add(0.0F);
params.add(interp);
// 画像の縮小
RenderedOp image2 = JAI.create("scale", params);
// 画像の書き出し
JAI.create("filestore", image2, outputName, imageType, null);
File inputFile = new File(inputName);
File outputFile = new File(outputName);
// タイムスタンプをそろえる
outputFile.setLastModified(inputFile.lastModified());
}
}
|
Today's Page Hits: 3668 |