Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ libpng:写入png失败:在头写入错误时停止_C++_Windows_Visual Studio 2008_Png_Libpng - Fatal编程技术网

C++ libpng:写入png失败:在头写入错误时停止

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

我想不出是怎么回事。当我尝试写入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 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,现在它抛出了“数千个荒谬的错误”,我不知道是什么错了。。。它们毫无意义。