libpngの使い方について教えてください
Posted: 2011年10月17日(月) 23:42
はじめまして、お世話になります。
Cについては初心者、開発環境はxcodeです。
最終的にやりたいことはメモリ上のpngデータをビットマップに変換することです。
http://ohwhsmm7.blog28.fc2.com/blog-entry-14.html
http://ysflight.in.coocan.jp/programmin ... oderj.html
上記サイトを参考にしているのですが、前者を参考にした方では
・FFFFFFFFになっている箇所が00000000になってしまう。フリーソフトなどで変換すると白くなるところが、黒に変換されてしまう。
・24bitパレットなしの画像は変換できたが、pixel深度やパレットなどがついた画像は、まったく元のデータと異なる画像になってしまう。
後者の方では
・透過部分に妙な色が付いてしまう。画像のメイン部分はきちんと表示されるが、背景に予測しない色が出てしまう。
(元の画像ファイルが多い為、画像の方を修正するのは避けたい)
という問題が発生しています。
libpngについての理解も浅く、なぜこのようなことが起きてしまっているのかわかりません。
これらのトラブルからどういった間違いが予測できるでしょうか?
この情報から何か思い当たるところのある方はご指摘お願い致します。
また、もう一点、上記サイト中のコードでどうしても理解できない箇所があるのですが、
と、byBmp(ここにビットマップデータを格納します)にカラーデータを格納していますが、
以上のようなメモリ確保となっているため、縱横のサイズがごく小さく、パレット数が多い画像の場合確保した領域を超えてしまっていることがあります。これは私には問題に思えるのですが、理解不足のためそう見えるだけなのでしょうか。
パレットをコピーしたあとの
の箇所も、取得した情報を上書きしてしまっているように見えます。
これらについて、何か誤りがあるのか、または私の理解に至らないところがあるとしたらそれはどこなのかを、お教えください。
よろしくお願いします。
Cについては初心者、開発環境はxcodeです。
最終的にやりたいことはメモリ上のpngデータをビットマップに変換することです。
http://ohwhsmm7.blog28.fc2.com/blog-entry-14.html
http://ysflight.in.coocan.jp/programmin ... oderj.html
上記サイトを参考にしているのですが、前者を参考にした方では
・FFFFFFFFになっている箇所が00000000になってしまう。フリーソフトなどで変換すると白くなるところが、黒に変換されてしまう。
・24bitパレットなしの画像は変換できたが、pixel深度やパレットなどがついた画像は、まったく元のデータと異なる画像になってしまう。
後者の方では
・透過部分に妙な色が付いてしまう。画像のメイン部分はきちんと表示されるが、背景に予測しない色が出てしまう。
(元の画像ファイルが多い為、画像の方を修正するのは避けたい)
という問題が発生しています。
libpngについての理解も浅く、なぜこのようなことが起きてしまっているのかわかりません。
これらのトラブルからどういった間違いが予測できるでしょうか?
この情報から何か思い当たるところのある方はご指摘お願い致します。
また、もう一点、上記サイト中のコードでどうしても理解できない箇所があるのですが、
for( int i = 0; i < num_palette; i++ )
{
byBmp[ i * 4 + 0 ] = palette[ i ].blue;
byBmp[ i * 4 + 1 ] = palette[ i ].green;
byBmp[ i * 4 + 2 ] = palette[ i ].red;
}
bi.biSizeImage = pInfo->height * ( ( ( pInfo->width * pInfo->pixel_depth / 8 ) + 3 ) & ~3 );
BYTE *byBmp = (BYTE*)::malloc( bi.biSizeImage );
パレットをコピーしたあとの
for( i = 0; i < number_passes; i++ )
{
for( j = pInfo->height - 1; j >= 0; j-- )
{
pRow = &byBmp[ j*row_size ];
png_read_row( pPng, pRow, NULL );
}
}
これらについて、何か誤りがあるのか、または私の理解に至らないところがあるとしたらそれはどこなのかを、お教えください。
よろしくお願いします。