如何在 C 上使用 libpng 编写调色板图像?
Posted
技术标签:
【中文标题】如何在 C 上使用 libpng 编写调色板图像?【英文标题】:How to write palette image use libpng on C? 【发布时间】:2012-01-26 18:56:37 【问题描述】:我的代码:
FILE *fp = fopen(file_name, "wb");
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
info_ptr = png_create_info_struct(png_ptr);
png_init_io(png_ptr, fp);
png_set_strip_alpha(png_ptr);
png_read_update_info(png_ptr, info_ptr);
png_set_IHDR(png_ptr, info_ptr, width, height,
8, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_set_PLTE(png_ptr, info_ptr, palette, num_palette);
png_write_info(png_ptr, info_ptr);
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, NULL);
fclose(fp);
我的结果:
http://rghost.ru/35558350/image.png
【问题讨论】:
不要故意删除您帖子的文件。 【参考方案1】:这是我今天为此编写的一些代码的缩写:
unsigned paletteSize = ...;
assert(paletteSize <= PNG_MAX_PALETTE_LENGTH);
png_color* palette = (png_color*)png_malloc(png_ptr, paletteSize*sizeof(png_color));
for (unsigned p = 0; p < paletteSize; p++)
png_color* col = &palette[p];
col->red = ...;
col->green = ...;
col->blue = ...;
png_set_PLTE(png_ptr, info_ptr, palette, paletteSize);
png_write_info(png_ptr, info_ptr);
// ... png_write_image, png_write_end
png_free(png_ptr, palette);
png_destroy_write_struct(&png_ptr, &info_ptr);
【讨论】:
以上是关于如何在 C 上使用 libpng 编写调色板图像?的主要内容,如果未能解决你的问题,请参考以下文章
使用 libpng 编写 1 位深度的灰度 PNG 会导致图像不正确