4

私はたくさんの画像を持っています.16 4ビット形式で必要な16色8ビットPNG形式の多くの画像を手作業で行う必要があります.それらはすべて同じパレットを持っています.

使用するのに最適なライブラリをGoogleで探していますが、この特定の問題についてはあまり見つけられていないため、よりターゲットを絞ったソリューションを求めてここに来ています.

ここで見つけた他の回答に基づいて PIL を使用しようとしていますが、運がありません。

img = Image.open('DownArrow_focused.png')
img = img.point(lambda i: i * 16, "L")
img.save('DownArrow_focused.png', 'PNG')

しかし、これは私が望むものではなく、グレースケールの画像を提供します。

PIL は動作しません。PyPNG を試してみてください。GIMPはこれを行いますが、バッチ処理するために必要なものが何百もあります。そして、変換するこれらのバッチを取得するため、1 回限りのことではありません。

Java ベースのソリューションも同様に受け入れられます。Linux/OSX マシンのコマンド ラインから実行できるほとんどすべてのものが受け入れられます。

4

2 に答える 2

1

PNG では、パレットは常に RGB8 (各インデックス = 色ごとに 3 バイト) で格納され、エントリ数は任意 (最大 256) です。現在、16 色パレット (合計 16 エントリ) の 8 ビット イメージがある場合、パレットを変更する必要はなく、ピクセル バイト (バイトごとに 2 つのインデックス) を再パックするだけです。もしそうなら、私はあなたがこのコードでPNGJでそれを行うことができると思います(未テスト):

public static void reencode(String orig, String dest) {
    PngReader png1 = FileHelper.createPngReader(new File(orig));
    ImageInfo pnginfo1 = png1.imgInfo;
    ImageInfo pnginfo2 = new ImageInfo(pnginfo1.cols, pnginfo1.rows, 4, false,false,true);  
    PngWriter png2 = FileHelper.createPngWriter(new File(dest), pnginfo2, false);
    png2.copyChunksFirst(png1, ChunksToWrite.COPY_ALL);
    ImageLine l2 = new ImageLine(pnginfo2);
    for (int row = 0; row < pnginfo1.rows; row++) {
        ImageLine l1 = png1.readRow(row);
        l2.tf_pack(l1.scanline, false);
        l2.setRown(row);
        png2.writeRow(l2);
    }
    png1.end();
    png2.copyChunksLast(png1, ChunksToWrite.COPY_ALL);
    png2.end();
    System.out.println("Done");
}

他の場所で、現在のパレットに 16 の「使用済み」色がある場合 (ただし、未使用の色が含まれているため長さが長くなります)、パレット チャンクを変更して何らかの作業を行う必要があります (ただし、それも実行できます)。

于 2011-09-26T01:44:20.300 に答える
0

次のコマンドを使用して、PythonスクリプトからNetpbmプログラム http://netpbm.sourceforge.net/を呼び出します。

$ pngtopnm test.png | pnmquant 16 | pnmtopng > test16.png

$ file test16.png
test16.png: PNG image data, 700 x 303, 4-bit colormap, non-interlaced

そして、GIMPはtest16.pngを持っていると報告Color space: Indexed color (16 colors)します。これはあなたが望むものだと思います。

これは純粋なPythonソリューションではありませんが、PILも純粋なPythonではなく、共有ライブラリにも依存しています。一部の外部画像ソフトウェアへの依存は避けられないと思います。

于 2011-09-25T16:34:09.147 に答える