54 fp = fopen(filename,
"wb");
57 fprintf(stderr,
"can't open %s\n", filename);
63 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
73 info_ptr = png_create_info_struct(png_ptr);
74 if( info_ptr == NULL )
77 png_destroy_write_struct(&png_ptr, NULL);
84 if( setjmp(png_jmpbuf(png_ptr)) )
88 png_destroy_write_struct(&png_ptr, &info_ptr);
94 png_init_io(png_ptr, fp);
95 auto const png_transforms = PNG_TRANSFORM_IDENTITY;
102 int const bit_depth = 8;
103 png_set_IHDR(png_ptr, info_ptr, imageData.
GetWidth(), imageData.
GetHeight(), bit_depth, PNG_COLOR_TYPE_RGB_ALPHA,
104 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
107 palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH
108 *
sizeof(png_color));
110 png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
122 png_set_sBIT(png_ptr, info_ptr, &sig_bit);
125 png_write_info(png_ptr, info_ptr);
129 for(
auto rowIterator = 0U; rowIterator < imageData.
GetHeight(); ++rowIterator )
131 png_bytep row_pointer =
new unsigned char[imageData.
GetWidth() * 4];
132 auto const rowLength = imageData.
GetWidth() * 4U;
133 auto const beginRow = imageDataVector.begin() + (rowIterator * rowLength);
134 auto const endRow = imageDataVector.begin() + (rowIterator * rowLength) + rowLength;
135 std::copy(beginRow, endRow, row_pointer);
137 png_write_row(png_ptr, row_pointer);
139 delete[] row_pointer;
143 png_write_end(png_ptr, info_ptr);
145 png_free(png_ptr, palette);
149 png_destroy_write_struct(&png_ptr, &info_ptr);
166static bool ReadPngFile(
char const* filename,
unsigned int& width,
unsigned int& height, std::vector<unsigned int>& rgbaImageDataVector)
171 memset(&image, 0, (
sizeof image));
172 image.version = PNG_IMAGE_VERSION;
175 if(png_image_begin_read_from_file(&image, filename) != 0)
183 image.format = PNG_FORMAT_RGBA;
189 buffer =
new png_byte[(PNG_IMAGE_SIZE(image))];
219 if (buffer != NULL &&
220 png_image_finish_read(&image, NULL, buffer,
224 height = image.height;
225 rgbaImageDataVector.clear();
226 for(
int i = 0; i < width * height * 4; ++i )
228 rgbaImageDataVector.push_back(*(buffer + i));
257 const unsigned char* memory,
260 unsigned int& height,
261 std::vector<unsigned int>& rgbaImageDataVector)
264 memset(&image, 0,
sizeof(image));
265 image.version = PNG_IMAGE_VERSION;
267 if (png_image_begin_read_from_memory(&image, memory, memorySize) == 0)
270 image.format = PNG_FORMAT_RGBA;
272 png_bytep buffer =
new png_byte[PNG_IMAGE_SIZE(image)];
276 if (png_image_finish_read(&image,
nullptr, buffer, 0,
nullptr) == 0)
283 height = image.height;
285 rgbaImageDataVector.resize(width * height * 4);
286 for (
size_t i = 0; i < width * height * 4; ++i)
287 rgbaImageDataVector[i] = buffer[i];
static bool ReadPngFromMemory(const unsigned char *memory, size_t memorySize, unsigned int &width, unsigned int &height, std::vector< unsigned int > &rgbaImageDataVector)
Reads a PNG image from memory into RGBA image data.
static bool ReadPngFile(char const *filename, unsigned int &width, unsigned int &height, std::vector< unsigned int > &rgbaImageDataVector)
Reads a PNG file into RGBA image data.