1

私はlibpngを初めて使用し、ドキュメントは私にとって本当に混乱しています。以下は動作していない私のコードで、その理由がわかりません。誰かが私を正しい方向に向けることができますか? または別の(「より簡単な」)ライブラリを提案しますか?

libpngを理解する方法:

  1. fopeninrbモードでファイルを開く

  2. png_structpで作成png_create_read_struct

  3. png_infopで作成png_create_info_struct

  4. スペースを割り当てる

  5. データを読む

    #include <stdio.h>
    #include <png.h>
    
    int main( int argc, char **argv )
    {
        int x, y;
        int height, width;
    
        png_structp png_ptr;
        png_infop info_ptr;
    
        png_bytep *row_pointers;
    
        FILE *fp = fopen( "test.png", "rb");
        {
            if (!fp)
                printf("File could not be opened for reading");
    
            png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    
            info_ptr = png_create_info_struct(png_ptr);
    
            png_read_info(png_ptr, info_ptr);
            width = png_get_image_width(png_ptr, info_ptr);
            height = png_get_image_height(png_ptr, info_ptr);
    
            row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);
            for (y=0; y<height; y++)
                row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png_ptr,info_ptr));
    
            png_read_image(png_ptr, row_pointers);
    
            fclose(fp);
        }
    
        for (y=0; y<height; y++) 
        {
            png_byte *row = row_pointers[y];
            for (x=0; x<width; x++) 
            {
                png_byte* ptr = &(row[x*4]);
                printf("Pixel at position [ %d - %d ] has RGBA values: %d - %d - %d - %d\n", x, y, ptr[0], ptr[1], ptr[2], ptr[3]);
            }
        }
    }
    
4

2 に答える 2

4

同様にpng_create_read_structで失敗しました。詳細な情報なしでデバッグするのは困難ですが (私の場合、stderr はどこにも行きません)、幸いなことに、独自のエラーおよび警告関数を提供できます。

void user_error_fn(png_structp png_ptr, png_const_charp error_msg);
void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg);

これを使用して、libpng は、アプリケーションが実行時に見つかった libpng とは異なるバージョンのヘッダーを使用していたことを示す役立つエラーを出力しました。謎が解けました。

したがって、個々の問題は異なる場合がありますが、libpng のエラー レポートを使用すると洞察が得られるはずです。

于 2014-02-05T15:26:40.893 に答える
1

明らかに、画像チャンクをどこでどのように読み取るかについて libpng に渡される情報はありません。使用する:

... png_init_io(png_ptr, fp); png_read_info..

于 2012-04-04T13:55:36.463 に答える