テスト用 PNG ファイル生成

PNG 画像の処理に色々と問題があるので、テストを綿密にやろうと
テスト用の PNG ファイルを作ってみました。
パレット形式かビットマップ形式か、何色使うかといったパターンを
手で作るのはやってられないので、プログラムで生成する事にします。

png_test.php

GD を使うと楽ですね。

<?php

$width  = 8;
$height = 8;

$im = imagecreatetruecolor($width, $height); /* bitmap */
// $im = imagecreate($width, $height);          /* palette */

$colors = array();
$colors []= imagecolorallocate($im, 255, 0, 0); // red
$colors []= imagecolorallocate($im, 0, 255, 0); // green
$colors []= imagecolorallocate($im, 0, 0, 255); // blue
$colors []= imagecolorallocate($im, 255,255,0); // yellow

for ($y=0 ; $y < $height ; $y++) {
    for ($x=0 ; $x < $width ; $x++) {
        $i = ($x + $y * $width) % 4;
        imagesetpixel($im, $x, $y, $colors[$i]);
    }
}

header("Content-type: image/png");
imagepng($im);

png_dump.c

とりあえず、何も考えずに dump してみる。

% ./a.out  ~/lang/php/16x16palette.png
png_filename=/home/yoya/lang/php/16x16palette.png
png_buff.data_len=94
(width, height)=(8,8) bpp=2 color_type=3(PALETTE) palette_num=4
y=0: 1b 1b 24 00 80 11 24 00
y=1: 1b 1b 00 00 00 00 00 00
y=2: 1b 1b 00 00 00 00 00 00
y=3: 1b 1b 00 00 00 00 00 00
y=4: 1b 1b 00 00 00 00 00 00
y=5: 1b 1b 00 00 00 00 00 00
y=6: 1b 1b 00 00 00 00 00 00
y=7: 1b 1b 00 00 00 00 00 00

ナルホド。

1b = 00011011 = 00 01 10 11 = 0 1 2 3

って事か。
吸い出したイメージ配列は bpp の bit width で並んでるようです。

png_dump.c 修正版

ビット処理を書くのが面倒なので、 swfed で作った bitstream.c を使いまわしました。

for (y=0; y < png_height; y++) {
    unsigned char *linedata = image_data[y];
    bitstream_t *bs = bitstream_open();
    bitstream_input(bs, linedata, png_get_rowbytes(png_ptr, png_info));
    printf("y=%lu: ", y);
    for (x=0; x < png_width; x++) {
        int colorindex = bitstream_getbits(bs, bpp);
        printf("%02x  ", colorindex);
    }
    bitstream_close(bs);
    printf("\n");
}

実行結果

% ./a.out 16x16palette.png
png_filename=16x16palette.png
png_buff.data_len=94
(width, height)=(8,8) bpp=2 color_type=3(PALETTE) palette_num=4
y=0: 00  01  02  03  00  01  02  03
y=1: 00  01  02  03  00  01  02  03
y=2: 00  01  02  03  00  01  02  03
y=3: 00  01  02  03  00  01  02  03
y=4: 00  01  02  03  00  01  02  03
y=5: 00  01  02  03  00  01  02  03
y=6: 00  01  02  03  00  01  02  03
y=7: 00  01  02  03  00  01  02  03

よし、完璧。(゜∇゜)

コンパイル方法

% gcc -Wall -W png_dump.c -lpng bitstream.c

使い方は上の通り。

追記 (2011/12/19)

imagemagick palette png」で検索された方はこちらも参考にどうぞ。