libpng: échec de l’écriture d’un fichier png: s’arrête à l’erreur d’écriture d’en-tête

Je ne peux pas comprendre ce qui ne va pas. Lorsque j’essaie d’écrire le fichier PNG, j’obtiens une erreur: “Erreur lors de l’écriture de l’en-tête”.

Dois-je inclure quelque chose d’autre? J’ai pris les fichiers .lib / .h à partir d’ici: http://www.eden.net.nz/7/20071024/

Edit: J’ai finalement réussi à faire ce travail.

La solution:

#pragma comment(lib, "zlib_s.lib") // must be before libpng! #pragma comment(lib, "libpng_s.lib") // must be after zlib! 

Bizarre, hein?

Voici le code de travail , c’est une version légèrement modifiée de: http://zarb.org/~gc/html/libpng.html
Note future: ceci doit être compilé en code C!

 #pragma comment(lib, "zlib_s.lib") // must be before libpng! #pragma comment(lib, "libpng_s.lib") // must be after zlib! #define PNG_DEBUG 0 #include "png.h" int x, y; int width, height; png_byte color_type; png_byte bit_depth; png_structp png_ptr; png_infop info_ptr; int number_of_passes; png_bytep *row_pointers; char *save_png(char *savefile, void *data_in, int w, int h, int BPP){ unsigned char *data = (unsigned char *)*data_in; int p = 0; FILE *fp; width = w; height = h; color_type = 2; bit_depth = 8; // create file fp = fopen(savefile, "wb"); if(!fp) return "[write_png_file] File %s could not be opened for writing"; // initialize stuff png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png_ptr) return "[write_png_file] png_create_write_struct failed"; info_ptr = png_create_info_struct(png_ptr); if(!info_ptr) return "[write_png_file] png_create_info_struct failed"; if(setjmp(png_jmpbuf(png_ptr))) return "[write_png_file] Error during init_io"; png_init_io(png_ptr, fp); // write header if(setjmp(png_jmpbuf(png_ptr))) return "[write_png_file] Error during writing header"; png_set_IHDR( png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE ); png_write_info(png_ptr, info_ptr); row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height); for(y = 0; y < height; y++){ row_pointers[y] = (png_byte*)malloc(width*BPP);//png_get_rowbytes(png_ptr,info_ptr)); for(x = 0; x < width; x++){ row_pointers[y][x*BPP+0] = data[p++]; row_pointers[y][x*BPP+1] = data[p++]; row_pointers[y][x*BPP+2] = data[p++]; } } // write bytes if(setjmp(png_jmpbuf(png_ptr))) return "[write_png_file] Error during writing bytes"; png_write_image(png_ptr, row_pointers); // end write if(setjmp(png_jmpbuf(png_ptr))) return "[write_png_file] Error during end of write"; png_write_end(png_ptr, NULL); // cleanup heap allocation for(y = 0; y < height; y++){ free(row_pointers[y]); } free(row_pointers); fclose(fp); return "0"; } 

Le problème était dans l’ordre des bibliothèques:

 #pragma comment(lib, "zlib_s.lib") // must be before libpng! #pragma comment(lib, "libpng_s.lib") // must be after zlib! 

Bizarre, mais ça corrige le problème!