2012-04-04 80 views
1

我是libpng的新手,文檔對我來說真的很讓人困惑。 下面是我的代碼不工作,我不明白爲什麼。 有人可以指向我正確的方向嗎?或建議不同的(「更容易」)圖書館?使用libpng無法讀取png文件

如何我理解的libpng:

  1. rb模式打開與fopen文件

  2. 創建png_structppng_create_read_struct

  3. 創建png_infoppng_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]); 
         } 
        } 
    } 
    
+1

什麼不工作? – user7116 2012-04-04 13:42:07

+0

'png_create_read_struct'失敗。 compilator不寫任何錯誤,它只是無所事事 – user1281071 2012-04-04 13:47:54

+0

如何如此?你必須更具體。 – user7116 2012-04-04 13:48:21

回答

1

顯然沒有傳遞到libpng的在哪裏/如何讀取圖像塊信息。使用:

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

+2

他仍然需要'png_ptr'非空來使用'png_init_io'。 – user7116 2012-04-04 13:58:45

+0

@sletterlettervariables:你是對的,但他會很快面對這個問題:-) – udslk 2012-04-04 15:28:54

4

我同樣在png_create_read_struct失敗。這是很難調試沒有進一步信息(在我的情況下,標準錯誤是條死衚衕),但幸運的是,你可以提供自己的錯誤和警告功能:

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的錯誤報告應該能夠提供洞察力。