1ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik/*- pngtopng 2ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * 3ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * COPYRIGHT: Written by John Cunningham Bowler, 2011. 4ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * To the extent possible under law, the author has waived all copyright and 5ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * related or neighboring rights to this work. This work is published from: 6ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * United States. 7ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * 8ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * Read a PNG and write it out in a fixed format, using the 'simplified API' 9ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * that was introduced in libpng-1.6.0. 10ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * 11ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * This sample code is just the code from the top of 'example.c' with some error 12ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * handling added. See example.c for more comments. 13ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik */ 14ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <stddef.h> 15ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <stdlib.h> 16ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <string.h> 17ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include <stdio.h> 18ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 19ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik/* Normally use <png.h> here to get the installed libpng, but this is done to 20ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * ensure the code picks up the local libpng implementation: 21ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik */ 22ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik#include "../../png.h" 23ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 24ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craikint main(int argc, const char **argv) 25ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik{ 26ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik int result = 1; 27ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 28ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (argc == 3) 29ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 30ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_image image; 31ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 32ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik /* Only the image structure version number needs to be set. */ 33ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik memset(&image, 0, sizeof image); 34ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik image.version = PNG_IMAGE_VERSION; 35ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 36ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (png_image_begin_read_from_file(&image, argv[1])) 37ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 38ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_bytep buffer; 39ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 40ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik /* Change this to try different formats! If you set a colormap format 41ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * then you must also supply a colormap below. 42ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik */ 43ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik image.format = PNG_FORMAT_RGBA; 44ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 45ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik buffer = malloc(PNG_IMAGE_SIZE(image)); 46ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 47ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (buffer != NULL) 48ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 49ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (png_image_finish_read(&image, NULL/*background*/, buffer, 50ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 0/*row_stride*/, NULL/*colormap for PNG_FORMAT_FLAG_COLORMAP */)) 51ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 52ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik if (png_image_write_to_file(&image, argv[2], 53ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 0/*convert_to_8bit*/, buffer, 0/*row_stride*/, 54ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik NULL/*colormap*/)) 55ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik result = 0; 56ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 57ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik else 58ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fprintf(stderr, "pngtopng: write %s: %s\n", argv[2], 59ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik image.message); 60ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 61ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik free(buffer); 62ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 63ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 64ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik else 65ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik { 66ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fprintf(stderr, "pngtopng: read %s: %s\n", argv[1], 67ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik image.message); 68ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 69ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik /* This is the only place where a 'free' is required; libpng does 70ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * the cleanup on error and success, but in this case we couldn't 71ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik * complete the read because of running out of memory. 72ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik */ 73ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik png_image_free(&image); 74ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 75ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 76ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 77ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik else 78ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fprintf(stderr, "pngtopng: out of memory: %lu bytes\n", 79ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik (unsigned long)PNG_IMAGE_SIZE(image)); 80ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 81ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 82ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik else 83ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik /* Failed to read the first argument: */ 84ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fprintf(stderr, "pngtopng: %s: %s\n", argv[1], image.message); 85ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik } 86ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 87ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik else 88ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik /* Wrong number of arguments */ 89ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik fprintf(stderr, "pngtopng: usage: pngtopng input-file output-file\n"); 90ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik 91ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik return result; 92ca2bf81b02c99afa2e76b3b2c6eb232c239221e0Chris Craik} 93