Takayuki Okazaki's Weblog
ブログ: 岡崎 - Okazaki's blog
20050307 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の準備
  • Java Advanced Imagingは標準のJ2SEに含まれていませんので、ライブラリを取得します。 http://java.sun.com/products/java-media/jai/
  • ダウンロードしたライブラリを開発環境やコンパイラのクラスパスに設定してください。
次は画像縮小のプログラム例です。
--- プログラム(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());
    }
}


過去の記事
3月 2005 »
  
1
2
3
4
6
8
10
12
13
16
18
19
20
21
22
23
24
25
26
27
29
30
  
       
今日
Click me to subscribe このブログを購読(RSS)
検索

このブログ著者について
ソフトウエア・インフラストラクチャー・ソリューション本部のソリューション・アーキテクトでした(2008年8月退職)。 本業はSOAソリューションならびにSun Java CAPSによるソリューションのプリセールスをお手伝いするエンジニア、とJavaエバンジェリストグループに参加してセミナーに行ったり、趣味のプログラミング・ネタをこのブログで紹介したりしていました。現在は、ふらふらとwatermint.orgで活動中〜。
リンク
 
SunホットトピックPodcast - SunホットトピックPodcast
 


 

Today's Page Hits: 3668