C++ libpng:写入png失败:在头写入错误时停止
我想不出是怎么回事。当我尝试写入PNG时,我得到一个错误:“写入头时出错” 我需要包括其他内容吗?我从这里获取了.lib/.h文件: 编辑:我终于成功了。 解决方案:C++ libpng:写入png失败:在头写入错误时停止,c++,windows,visual-studio-2008,png,libpng,C++,Windows,Visual Studio 2008,Png,Libpng,我想不出是怎么回事。当我尝试写入PNG时,我得到一个错误:“写入头时出错” 我需要包括其他内容吗?我从这里获取了.lib/.h文件: 编辑:我终于成功了。 解决方案: #pragma comment(lib, "zlib_s.lib") // must be before libpng! #pragma comment(lib, "libpng_s.lib") // must be after zlib! 奇怪吧 这是工作代码,它是: 未来注意:这必须编译为C代码 #pragma commen
#pragma comment(lib, "zlib_s.lib") // must be before libpng!
#pragma comment(lib, "libpng_s.lib") // must be after zlib!
奇怪吧
这是工作代码,它是:未来注意:这必须编译为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";
}
#pragma comment(lib,“zlib_.lib”)//必须在libpng之前!
#pragma comment(lib,“libpng_.lib”)//必须在zlib之后!
#定义PNG_调试0
#包括“png.h”
int x,y;
int宽度、高度;
png_字节颜色_类型;
png字节位深度;
png_structp png_ptr;
png_infop info_ptr;
int通过次数;
png_字节*行指针;
char*save_png(char*savefile,void*data_in,int w,int h,int BPP){
无符号字符*数据=(无符号字符*)*数据\u in;
int p=0;
文件*fp;
宽度=w;
高度=h;
颜色类型=2;
位深度=8;
//创建文件
fp=fopen(保存文件,“wb”);
如果(!fp)返回“[write\u png\u file]文件%s无法打开进行写入”;
//初始化内容
png_ptr=png_create_write_struct(png_LIBPNG_VER_STRING,NULL,NULL);
如果(!png_ptr)返回“[write_png_file]png_create_write_struct failed”;
info_ptr=png_create_info_struct(png_ptr);
如果(!info_ptr)返回“[write_png_file]png_create_info_struct failed”;
if(setjmp(png_jmpbuf(png_ptr)))返回“[write_png_file]init_io期间出错”;
png_init_io(png_ptr,fp);
//写头
if(setjmp(png_jmpbuf(png_ptr)))返回“[write_png_file]写入头时出错”;
png\U set\U IHDR(
png_ptr,信息_ptr,宽度,高度,
位深度、颜色类型、PNG交错、无,
PNG\压缩\类型\基础,PNG\过滤器\类型\基础
);
png_write_info(png_ptr,info_ptr);
行指针=(png\u bytep*)malloc(sizeof(png\u bytep)*高度);
对于(y=0;y<高度;y++){
行指针[y]=(png字节*)malloc(宽度*BPP);//png获取行字节(png字节,信息字节));
对于(x=0;x
问题按库的顺序排列:
#pragma comment(lib, "zlib_s.lib") // must be before libpng!
#pragma comment(lib, "libpng_s.lib") // must be after zlib!
奇怪,但这解决了问题 >这里,你写的是C,所以你应该把它编译成C。千万不要使用C++代码> SETJMP <代码> />代码> LojJMP < /Cube >或其他C函数,附带C++代码中的副作用。这就是第一个警告的内容。@trion,我明白了。。。是否可以编译为C++代码?@ TrIon,当我试图编译它为.c文件时,我会发现成千上万个荒谬的错误。是否有可能在C++项目中编译C文件(我看不到.c文件添加选项,所以我只是更名为CPP到.c)?我会犯一些奇怪的错误,比如:“y未声明”,即使它已声明!你为什么要这么做?这里不使用任何C++特性。如果你想在项目的另一部分使用C++,创建一个标题,声明“代码>外部”C无效写-pnggfile(char *文件名)<代码>,编译你的源文件为C,并从C++文件中使用<代码>写的pNGGfile文件>代码> @ TrIon,我想把它转换成C++,因为我不能编译C,正如我所说:我得到了数千个荒谬的错误。所以我想知道visual studio 2008是否支持它,因为当我想创建新的源文件时,我找不到.c文件扩展名。目前我刚刚将.cpp重命名为.c,现在它抛出了“数千个荒谬的错误”,我不知道是什么错了。。。它们毫无意义。