あけましておめでとうございます。

昨年の2006年はJavaにとってエポックメーキングな年でした。5月にJava EE 5がリリースされ,12月にはJava SE 6がリリースされています。また,11月にはJavaがオープンソースになるというビッグニュースも飛び込んできました。

昨年に比べると,今年は端境期ということもあり,あまり大きな動きはないかもしれません。しかし,Java EE 6やJava SE 7に対する準備が着々と進んでいるようです。例えば,Java SE 7では,XMLリテラルやスーパーパッケージなど言語仕様の変更も予定されており,目が離せないところです。

さらに,最近ではJava EE/SEといったメインストリームではなく,オープンソースのプロジェクトから技術革新が起こることも多々あります。Apache Software FoundationThe Eclipse Foundationなどもしっかりとウオッチしていく必要がありそうです。

ということで,今年もいろいろなトピックを取り上げていこうと思います。本年もJava技術最前線をご贔屓のほどよろしくお願いします。

さて,年は変わりましたが,引き続きJava SE 6の新機能を取りあげていきましょう。

今回から,デスクトップやGUIに関する新機能を紹介していきます。今月はまずAWT関連の新機能です。

なお,今回からベータではなく,正式にリリースされたJava SE 6を使用していきます。

GIFファイルは読めるのだが...

J2SE 1.4から導入されたImage I/Oを使えば,イメージ・ファイルの読み込み/書き込みを簡単に行うことができます。

簡単に行えるだけではなく,より詳細な制御も行うことも可能です。例えば,デジタルカメラで撮影したイメージ・ファイルに埋め込まれているExifメタデータを扱うことや,サムネイルやマルチイメージなども扱うことができます。

とても便利なAPIなのですが,残念ながらJ2SE 5.0までは提供されていなかった機能もあります。

その機能は,GIFファイルの書き込みです。さっそく,サンプルで確かめてみましょう。

サンプルはここからダウンロードできます:ImageCopySample.java

プログラムはとても簡単です。javax.imageio.ImageIOクラスを使用し,readメソッドで読み込み,writeメソッドで書き込みを行います。

writeメソッドの第2引数は出力形式になります。ここでは書き込むファイル名の拡張子をそのまま使用してしまいました。また,writeメソッドの戻り値はbooleanで,書き込みが失敗したときにfalseになります。

public ImageCopySample(String src, String dest) {
    try {
        BufferedImage image = ImageIO.read(new File(src));

        int index = dest.lastIndexOf(".");
        String format = dest.substring(index+1);

        if (!ImageIO.write(image, format, new File(dest))) {
            System.out.println("書き込みに失敗しました");
        }
    } catch (IOException ex) {
        System.err.println("入出力に失敗しました");
    }
}

このサンプルを,まずJ2SE 5.0で実行してみます。

ImageCopySampleクラスは引数を二つ取ります。第1引数が読み込むイメージ・ファイル名,第2引数が書き込むイメージ・ファイル名になります。

C:\temp>java ImageCopySample duke.jpg duke.gif
書き込みに失敗しました
 
C:\temp>

書き込みに失敗してしまいました。duke.gifというファイルは作成されるのですが,サイズは0です。

次にJava SE 6で実行してみましょう。

C:\temp>java ImageCopySample duke.jpg duke.gif
 
C:\temp>

無事に書き込みができたようです。二つのファイルを比べてみると,GIFは色数が限られているので,Dukeの鼻が縞模様になってしまいました。

返還前 duke.jpg 変換後 duke.gif
図1 変換前 duke.jpg 図2 変換後 duke.gif

なぜ,J2SE 5.0まではできなかったGIFファイルの書き込みがJava SE 6ではできるようになったのでしょうか。これは技術的な問題ではなく,米Unisysが保持していたGIFの関連特許が2004年に失効したためです。新機能でも何でもありませんが,便利になることは確かです。

なお,java.netのjai-imageioプロジェクトでは,Java SE 6で扱えるJPEG,PNG,BMP,WBMP,GIF以外に,以下のフォーマットを扱うことができるライブラリを提供しています。

  • JPEG 200
  • PNM
  • TIFF
  • Raw

筆者にとってはTIFFが扱えるのがうれしいところです。ちなみにプロジェクト名についているjaiはJava Advanced Imagingというライブラリのことです。Image I/OはもともとJAIの一部だったのですが,切り離されてJava SEに組み込まれたのです。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

櫻庭にとって例年,1月から2月にかけて散財の日々が続きます。というのも,この季節はショコラティエ(チョコレート職人)が腕によりをかけたチョコレートが巷をにぎわすからであります。また,チョコレートを食べるのには冬の室温ぐらいがちょうどいいのです。

もちろん,当然のごとく自分買いです。

今年の目玉はフランス以外に出展するのは初というベルナシオン。また,時期的にはちょっと先になりますがノカチョコレートも気になる存在であります。もちろん,既存のショコラティエも忘れるわけにはいきません。

というわけで,財布はやせ細り,体重だけは増え続けるという日々を過ごすわけであります。