PNG API

プログラミング

自前で進めている古パソコンの解析作業(古パソコンの部屋参照)を進めるにあたって、文字フォントのビットマップから画像ファイルを機械的に生成するために、ビットマップデータから画像ファイルへの変換プログラムが必要になった。ブラウザで画像が見られることを前提としたため当初はGIFを検討したが、GIFを生成するプログラムは特許問題のため自作できないので、PNGを生成するものを作ることにした。

Java2 SD 1.4から、javax.imageioパッケージが追加され、画像ファイルの入出力を簡単にできるようになりました。今となってはここで公開しているライブラリの価値はあまりないと思いますが、PNGファイルを扱うための実装例として何かの役に立てばという思いで公開を続けます。

プログラム

PNGライブラリはJavaで作っています。必要なクラスを以下のjarファイルにまとめてありますので、ダウンロードして使ってください。同時にソースも公開します。皆様がPNG関係のプログラムを作る際の参考になるとうれしいです。

JARファイル(2002年2月4日版)

“PNG API” をダウンロード png.jar – 296 回のダウンロード – 19 KB

ソースアーカイブ
実行環境 :The Java 2 Platform, Standard Edition v1.3.1_02

APIドキュメント

javadocに通したものを以下に示します。将来はこのパッケージの中にグラフィック用のライブラリを追加していく予定です。

jp.or.rim.kt.kemusiro.image パッケージ

使い方

(詳細な使い方は追々記述していきます)

サンプルを以下に示します。以下のファイルをPngTest.javaに保存し、上でダウンロードしたpng.jarをカレントディレクトリに置いてあるとすると、

% javac PngTest.java
% java -classpath "png.jar;." PngTest

とすることで`×'を表示するPNGファイルが得られます(クラスパスに注意)。

import jp.or.rim.kt.kemusiro.image.Png;
import java.io.File;
import java.io.FileOutputStream;

class PngTest {
    public static void main(String[] args) {
        ImageData id = new ImageData(8); // 画素8ビット
        id.append((byte)0x81);
        id.terminateLine();
        id.append((byte)0x42);
        id.terminateLine();
        id.append((byte)0x24);
        id.terminateLine();
        id.append((byte)0x18);
        id.terminateLine();
        id.append((byte)0x18);
        id.terminateLine();
        id.append((byte)0x24);
        id.terminateLine();
        id.append((byte)0x42);
        id.terminateLine();
        id.append((byte)0x81);
        id.terminateLine();

        try {
            Png png = new Png(id, Png.TYPE_GLAY); // グレイスケール
            FileOutputStream output
                = new FileOutputStream(new File("batsu.png"));
            png.encode();      // ビットマップデータをPNGに変換
            png.write(output); // ファイルに書き出し
            output.close();    // ファイルを閉じる。
         }
         catch (Throwable e) {
             System.err.println(e.toString());
         }
     }
}

PNGとJava

PNGではデータの誤送信を検出するためにCRCを計算します。また、データを可逆圧縮するためにLZ77という圧縮アルゴリズムを用います。 これらの計算・処理を行うプログラムを自作しても良いのですが、Javaでは標準ライブラリで用意されています。

  • java.util.zip.CRC32
  • java.util.zip.Deflater

これらのおかげでプログラムの開発が非常に楽でした。JDKには有用なたくさんのライブラリが含まれています。活用しない手はないでしょう。

コメント

タイトルとURLをコピーしました