[英]libpng: writing a png fails: stops at header write error
I can't figure out what is wrong. 我不知道怎么了。 When I try to write the PNG, I get an error: "Error during writing header".
尝试编写PNG时,出现错误:“写入标题时出错”。
Do I need to include something else? 我需要添加其他内容吗? I took the .lib/.h files from here: http://www.eden.net.nz/7/20071024/
我从这里获取了.lib / .h文件: http : //www.eden.net.nz/7/20071024/
Edit: I finally managed to make this work. 编辑:我终于设法使这项工作。
The solution: 解决方案:
#pragma comment(lib, "zlib_s.lib") // must be before libpng!
#pragma comment(lib, "libpng_s.lib") // must be after zlib!
Weird, huh? 奇怪吧?
Here is the working code, it's a slightly modified version of: http://zarb.org/~gc/html/libpng.html 这是工作代码,它是以下代码的略微修改版本:http: //zarb.org/~gc/html/libpng.html
Future note: this must be compiled as C 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";
}
The problem was in the order of the libraries: 问题出在库的顺序中:
#pragma comment(lib, "zlib_s.lib") // must be before libpng!
#pragma comment(lib, "libpng_s.lib") // must be after zlib!
Weird, but that fixed the problem! 很奇怪,但这解决了问题!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.