2012-12-17 62 views
0

我使用libpng生成png文件。對於RGB png,沒有問題。但我想給png一個透明的屬性。如何讓png具有透明屬性

我參考一些代碼,並添加地方使用*到已檢舉

* 行++ = 230; * PNG_COLOR_TYPE_RGBA,*

,使其具有透明特性, 代碼成功地運行,但餘did't看到透明效果。

任何熟悉libpng或png操作的人都能幫助我嗎?

在此代碼中, 其中pixel_t,& bitmap_t是一些帶有rgb數據的數據。

/* A colored pixel. */ 
typedef struct { 
    uint8_t red; 
    uint8_t green; 
    uint8_t blue; 
} pixel_t; 


/* A picture. */ 
typedef struct { 
    pixel_t *pixels; 
    size_t width; 
    size_t height; 
} bitmap_t; 


static int save_png_to_file (bitmap_t *bitmap, const char *path) 
{ 
    FILE * fp; 
    png_structp png_ptr = NULL; 
    png_infop info_ptr = NULL; 
    size_t x, y; 
    png_byte ** row_pointers = NULL; 
    /* "status" contains the return value of this function. At first 
     it is set to a value which means 'failure'. When the routine 
     has finished its work, it is set to a value which means 
     'success'. */ 
    int status = -1; 
    /* The following number is set by trial and error only. I cannot 
     see where it it is documented in the libpng manual. 
    */ 
    int pixel_size = 3; 
    int depth = 8; 

    fp = fopen (path, "wb"); 
    if (! fp) { 
     goto fopen_failed; 
    } 

    png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 
    if (png_ptr == NULL) { 
     goto png_create_write_struct_failed; 
    } 

    info_ptr = png_create_info_struct (png_ptr); 
    if (info_ptr == NULL) { 
     goto png_create_info_struct_failed; 
    } 


    // png_set_invert_alpha(png_ptr); 



    /* Set up error handling. */ 

    if (setjmp (png_jmpbuf (png_ptr))) { 
     goto png_failure; 
    } 

    /* Set image attributes. */ 


    png_set_IHDR (png_ptr, 
        info_ptr, 
        bitmap->width, 
        bitmap->height, 
        depth, 
        *PNG_COLOR_TYPE_RGBA,* 
        PNG_INTERLACE_NONE, 
        PNG_COMPRESSION_TYPE_DEFAULT, 
        PNG_FILTER_TYPE_DEFAULT); 

    /* Initialize rows of PNG. */ 
    //(png_byte **) added by li 
    row_pointers = (png_byte **)png_malloc (png_ptr, bitmap->height * sizeof (png_byte *)); 

    for (y = 0; y < bitmap->height; ++y) { 
     //png_byte * added by li 
//   png_byte *row = (png_byte *) 
//    png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * pixel_size); 
     png_byte *row = (png_byte *) 
      png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * 4); 


     row_pointers[y] = row; 
     for (x = 0; x < bitmap->width; ++x) { 
      pixel_t * pixel = pixel_at (bitmap, x, y); 
      *row++ = pixel->red; 
      *row++ = pixel->green; 
      *row++ = pixel->blue; 
      **row++ = 230;* 

     } 
    } 

    /* Write the image data to "fp". */ 

    png_init_io (png_ptr, fp); 
    png_set_rows (png_ptr, info_ptr, row_pointers); 
    png_write_png (png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); 

    /* The routine has successfully written the file, so we set 
     "status" to a value which indicates success. */ 

    status = 0; 

    for (y = 0; y < bitmap->height; y++) { 
     png_free (png_ptr, row_pointers[y]); 
    } 
    png_free (png_ptr, row_pointers); 

png_failure: 
png_create_info_struct_failed: 
    png_destroy_write_struct (&png_ptr, &info_ptr); 
png_create_write_struct_failed: 
    fclose (fp); 
fopen_failed: 
    return status; 
} 

回答

1

用α-甲真彩色PNG圖像,與位深度= 8,存儲透明度作爲額外信道,在RGBA順序,在0-255範圍內(0 =完全透明; 255 =完全不透明)。

你在做什麼看起來對我來說是正確的。只有230的值意味着「幾乎不透明」,可能難以直觀地檢測到透明度。嘗試其他值。

順便說一句,請記住,還有其他方法可以爲PNG圖像添加透明度,請參閱我的回答here

+0

你有任何即時消息的東西?我有一些問題,但需要顯示照片 – user1279988

+0

@ user1279988我的電子郵件是在我的個人資料 – leonbloy

+0

對不起。你可以選擇別人看不到你的電子郵件帳戶。我看不到它。它是從您的pngj項目所有者帳戶[email protected]中挖掘出來的,謝謝 – user1279988