2014-10-22 86 views
0
FILE *PNGFile; 
    png_structp PngPtr = NULL; 
    png_infop InfoPtr = NULL; 

    PNGFile = fopen(sFileName, "wb"); 
    PngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 
    NULL, NULL, NULL); 
    InfoPtr = png_create_info_struct(PngPtr); 
    png_init_io(PngPtr, PNGFile); 
    png_set_IHDR(PngPtr, InfoPtr, nWidth, nHeight, NumBits, PNG_COLOR_TYPE_PALETTE, 
     PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); 
    png_set_PLTE(PngPtr, InfoPtr, PNGColor, NumColors); //NumColors = 256 

    png_color_16 BGColor[1]; 
    png_byte TrnsColor[1]; 
    BGColor[0].index = 0; 
    TrnsColor[0] = 100; //0 = transparent , 255 = opaque 
    png_set_tRNS(PngPtr, InfoPtr, TrnsColor, 1, BGColor); 
    png_write_info(PngPtr, InfoPtr); 

    ....... 
    ........ //intialized image pixels 

    png_write_image(PngPtr, PixelData); 
    png_write_end(PngPtr, InfoPtr); 

使用上面的代码,我能保存图像,但我没能看到透明度,这是使用“png_set_tRNS(PngPtr,InfoPtr,TrnsColor,1套像素, BGCOLOR)”。png_set_tRNS不工作了libpng

当我使用png_get_tRNS方法读取已保存图像的tRNS块时,我可以获取已设置的值,但是在使用某些图像查看应用程序打开它时无法看到透明度。

我在代码中丢失了什么吗?

+0

谢谢你@ GlennRanders-Pehrson我为wronng索引设置了alpha值 – 2014-10-30 04:42:08

+0

我将两条评论转换为答案。 – 2015-07-08 22:26:53

回答

0

你的代码只会影响调色板索引== 0的任何像素。

如果你希望看到所有的像素为半透明,阿尔法== 100,那么你需要在TrnsColor 256项,所有的人== 100

顺便说一句,你不”在写入调色板PNG时,需要使用BGColor []。只需使用NULL作为png_set_tRNS的最后一个参数。