#include void savePNG(const char *filename, int width, int height, float *red, float *green, float *blue, float *alpha) { png_byte colorType=PNG_COLOR_TYPE_RGBA; png_byte bitDepth=8; png_structp pngPtr; png_infop pngInfo; png_bytep *rowPointers; rowPointers=new png_bytep[height]; for(int j=0;j1) { clampedRed=1.0; } float clampedGreen=green[j*width+i]; if(clampedGreen>1) { clampedGreen=1.0; } float clampedBlue=blue[j*width+i]; if(clampedBlue>1) { clampedBlue=1.0; } float clampedAlpha=alpha[j*width+i]; if(clampedAlpha>1) { clampedAlpha=1.0; } rowPointers[j][(i*4)]=(unsigned char)(clampedRed*0xFF); rowPointers[j][(i*4)+1]=(unsigned char)(clampedGreen*0xFF); rowPointers[j][(i*4)+2]=(unsigned char)(clampedBlue*0xFF); rowPointers[j][(i*4)+3]=(unsigned char)(clampedAlpha*0xFF); } } // create file FILE *fp; if (!(fp = fopen(filename, "wb"))) return; pngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!pngPtr) { return; } pngInfo = png_create_info_struct(pngPtr); if(!pngInfo) { return; } if(setjmp(png_jmpbuf(pngPtr))) { return; } png_init_io(pngPtr, fp); // write header if(setjmp(png_jmpbuf(pngPtr))) { return; } png_set_IHDR(pngPtr, pngInfo, width, height, bitDepth, colorType, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_set_gAMA(pngPtr,pngInfo,1.0); png_write_info(pngPtr, pngInfo); // write image if(setjmp(png_jmpbuf(pngPtr))) { return; } png_write_image(pngPtr, (png_byte**)rowPointers); if(setjmp(png_jmpbuf(pngPtr))) { return; } png_write_end(pngPtr, NULL); for(int i=0; i