Конвертировать 8-битный PNG в 32-битный PNG с прозрачностью, используя libpng - PullRequest
0 голосов
/ 09 апреля 2020

Возникла проблема при попытке преобразовать 8-битный PNG в 32-битный PNG с использованием libpng.

Я установил png_set_palette_to_rgb (png) и вызвал png_read_update_info. Однако изображение не отображается должным образом, т.е. я получаю полупрозрачное изображение, однако цвет изображения каким-то образом изменяется.

Я использовал следующий код.

png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png) abort();

png_infop info = png_create_info_struct(png);
if (!info) abort();

if (setjmp(png_jmpbuf(png))) abort();

png_init_io(png, fp);

png_read_info(png, info);

width_      = png_get_image_width(png, info);
height_     = png_get_image_height(png, info);
color_type_ = png_get_color_type(png, info);
bit_depth_  = png_get_bit_depth(png, info);

// Read any color_type into 8bit depth, RGBA format.
// See http://www.libpng.org/pub/png/libpng-manual.txt

if (bit_depth_ == 16)
  png_set_strip_16(png);

if (color_type_ == PNG_COLOR_TYPE_PALETTE)
  png_set_palette_to_rgb(png);


if (png_get_valid(png, info, PNG_INFO_tRNS))
  png_set_tRNS_to_alpha(png);

// These color_type don't have an alpha channel then fill it with 0xff.
if (color_type_ == PNG_COLOR_TYPE_RGB ||
    color_type_ == PNG_COLOR_TYPE_GRAY ||
    color_type_ == PNG_COLOR_TYPE_PALETTE)
  png_set_filler(png, 0xFF, PNG_FILLER_AFTER);

if (color_type_ == PNG_COLOR_TYPE_GRAY ||
    color_type_ == PNG_COLOR_TYPE_GRAY_ALPHA)
  png_set_gray_to_rgb(png);

png_read_update_info(png, info);
...