#include <stdio.h>
#include <png.h>
#include <stdlib.h>
// См. http://zarb.org/~gc/html/libpng.html (A simple libpng example program)
int main(int argc, char **argv) {
if (argc < 2) {
printf("pngwrite [filename.png]\n");
return -1;
}
const char *filename = argv[1];
FILE *f = fopen(filename, "wb");
int w = 1000;
int h = 1000;
int bpp = 16;
png_structp hw; // Handle for writing
png_infop info;
hw = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
info = png_create_info_struct(hw);
setjmp(png_jmpbuf(hw));
png_init_io(hw, f);
setjmp(png_jmpbuf(hw));
png_set_IHDR(hw, info,
w, h, bpp, PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_write_info(hw, info); // write header
png_bytep *rows;
rows = (png_bytep*)malloc(sizeof(png_bytep)*h);
for (int y = 0; y < h; y++)
rows[y] = (png_byte*)malloc(4*w);
//rows[y] = (png_byte*)malloc(png_get_rowbytes(hw,info));
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++) {
rows[y][x*4+0] = 255;
rows[y][x*4+1] = 0;
rows[y][x*4+2] = 255;
rows[y][x*4+3] = 0;
}
setjmp(png_jmpbuf(hw));
png_write_image(hw, rows); // bytes write
setjmp(png_jmpbuf(hw));
png_write_end(hw, NULL); // end write
for (int y = 0; y < h; y++) free(rows[y]);
free(rows);
fclose(f);
return 0;
}
Выдается такой файл: http://php.kirovnet.ru/images/pngwrite-sample-error-shot.png
Как видно - черная полоса посередине картинки из белых пикселей.
Вроде, картинка должна получиться фиолетовой.
Почему так? Может быть, я неправильно задаю параметр bpp?
Допустимые значения для bpp беру отсюда: http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html