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