1

libpng にそのデータを構造体にダンプさせることができないようです。何が間違っているのかわかりません。PNGは上から下に保存され、下から上にデータが必要なため、バイトを反転しようとしています。

まず、構造体は次のようになります。

typedef union RGB
{
    uint32_t Color;
    struct
    {
        unsigned char B, G, R, A;
    } RGBA;
} *PRGB;

次に、ベクターを次のように作成しました。

png_init_io(PngPointer, hFile);
png_set_sig_bytes(PngPointer, 8);
png_read_info(PngPointer, InfoPointer);

uint32_t width, height;
int bitdepth, colortype, interlacetype, channels;

png_set_strip_16(PngPointer);
channels = png_get_channels(PngPointer, InfoPointer);
png_get_IHDR(PngPointer, InfoPointer, &width, &height, &bitdepth, &colortype, &interlacetype, nullptr, nullptr);


uint32_t RowBytes = png_get_rowbytes(PngPointer, InfoPointer);
unsigned char** RowPointers = png_get_rows(PngPointer, InfoPointer);
std::vector<RGB> Pixels(RowBytes * height);   //Amount of bytes in one row * height of image.

//Crashes in the for loop below :S

for (int I = 0; I < height; I++)
{
    for (int J = 0; J < width; J++)
    {
        Pixels[(height - 1 - I) * width + J].RGBA.B = *(RowPointers[J]++);
        Pixels[(height - 1 - I) * width + J].RGBA.G = *(RowPointers[J]++);
        Pixels[(height - 1 - I) * width + J].RGBA.R = *(RowPointers[J]++);
    }
}

std::fclose(hFile);
png_destroy_read_struct(&PngPointer, &InfoPointer, nullptr);

私は何を間違えましたか?PNG のピクセルを取得して上下逆に保存するにはどうすればよいですか? ビットマップにも同じ手法を使用しましたが、PNG は機能しません:l

4

1 に答える 1

3

これはいけません:

Pixels[(height - 1 - I) * width + J].RGBA.B = *(RowPointers[J]++);

代わりにインデックスRowPointersを作成しますか?I

于 2012-12-22T19:56:14.057 に答える