如何在C上使用libpng编写调色板图像?

发布于 2024-12-22 18:20:07 字数 774 浏览 4 评论 0原文

如何在C上使用libpng编写调色板图像? 我的代码:

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

How to write palette image use libpng on C?
My code :

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);

My result:

http://rghost.ru/35558350/image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

只是我以为 2024-12-29 18:20:07

这是我今天为此编写的一些代码的缩写:

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);

Here's an abbreviation of some code I wrote today to do this:

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文