24,861
社区成员




int writePng(unsigned char* png_file_name, unsigned char* pixels , int width, int height, int bit_depth)
{
png_structp png_ptr;
png_infop info_ptr;
FILE *png_file = fopen(png_file_name, "wb");
if (!png_file)
{
return -1;
}
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(png_ptr == NULL)
{
printf("ERROR:png_create_write_struct/n");
fclose(png_file);
return 0;
}
info_ptr = png_create_info_struct(png_ptr);
if(info_ptr == NULL)
{
printf("ERROR:png_create_info_struct/n");
png_destroy_write_struct(&png_ptr, NULL);
return 0;
}
png_init_io(png_ptr, png_file);
png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, /*PNG_COLOR_TYPE_PALETTE*/PNG_COLOR_TYPE_RGB_ALPHA,
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_colorp palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof(png_color));
if (!palette) {
fclose(png_file);
png_destroy_write_struct(&png_ptr, &info_ptr);
return false;
}
png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
png_write_info(png_ptr, info_ptr);
png_set_packing(png_ptr);
//这里就是图像数据了
png_bytepp rows = (png_bytepp)png_malloc(png_ptr, height * sizeof(png_bytep));
for (int i = 0; i < height; ++i)
{
rows[i] = (png_bytep)(pixels + (i) * width * 4);
}
png_write_image(png_ptr, rows);
delete[] rows;
png_write_end(png_ptr, info_ptr);
png_free(png_ptr, palette);
palette=NULL;
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(png_file);
return 0;
}
其中pixels为4字节rgba 4字节格式,对应该模式PNG_COLOR_TYPE_RGB_ALPHA。
如果是PNG_COLOR_TYPE_RGB,则只需要rgb 3字节的格式