Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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++ 保存PNG图像_C++_C_Image_Png - Fatal编程技术网

C++ 保存PNG图像

C++ 保存PNG图像,c++,c,image,png,C++,C,Image,Png,保存png图像时遇到问题 我想在png文件中添加一些二进制数据,如以下结构 struct Foo { int value; char str[10]; double val; double val2; }; 使用以下代码似乎可以很好地保存。然而,当我稍后加载png文件时,我看到我的区块没有被保存,它已经消失了。我做错了什么?我的需求很简单,我只想在图像本身中嵌入一点额外的二进制信息 Foo foo; png_unknown_chunk chunks[1

保存png图像时遇到问题

我想在png文件中添加一些二进制数据,如以下结构

struct Foo
{
     int value;
     char str[10];
     double val;
     double val2;
};
使用以下代码似乎可以很好地保存。然而,当我稍后加载png文件时,我看到我的区块没有被保存,它已经消失了。我做错了什么?我的需求很简单,我只想在图像本身中嵌入一点额外的二进制信息

Foo foo;

png_unknown_chunk chunks[1];
strcpy((png_charp)chunks[0].name, "fFoo");
chunks[0].data = &foo;
memcpy(chunks[0].data,&foo,sizeof(Foo)*1);
chunks[0].size = sizeof(Foo);
png_set_unknown_chunks(png_ptr, info_ptr, chunks, 1);

printf("1: %d\n",(int)info_ptr->unknown_chunks_num);
for (int n = 0; n < info_ptr->unknown_chunks_num; ++n)
{
    tag_pngmeta p;
    memcpy(&p,info_ptr->unknown_chunks[n].data,info_ptr->unknown_chunks[n].size);

    printf("2: %s,%d\n",info_ptr->unknown_chunks[n].name, 
        (int)info_ptr->unknown_chunks[n].size);

    printf("3: %s\n",p.name);
}
Foo-Foo;
png_未知_块[1];
strcpy((png_charp)块[0]。名称,“fFoo”);
块[0]。数据=&foo;
memcpy(块[0]。数据,&foo,sizeof(foo)*1);
块[0]。大小=sizeof(Foo);
png_集_未知_块(png_ptr,info_ptr,chunks,1);
printf(“1:%d\n”,(int)info\u ptr->unknown\u chunks\u num);
对于(int n=0;nunknown\u chunks\u num;++n)
{
tag_pngmeta p;
memcpy(&p,信息块->未知块[n]。数据,信息块->未知块[n]。大小);
printf(“2:%s,%d\n”,信息\u ptr->未知\u块[n]。名称,
(int)信息\u ptr->未知\u块[n]。大小);
printf(“3:%s\n”,p.name);
}
上面显示缓冲区已正确更新,并且我的数据已嵌入到图像中

然而,当我后来加载它时,它不见了。下面是我如何从保存的png再次加载它

png_unknown_chunkp unknowns;
int num_unknowns = (int)png_get_unknown_chunks(png_ptr, info_ptr, &unknowns);
printf("%d-----\n",(int)num_unknowns);

printf("%d\n",(int)info_ptr->unknown_chunks_num);
for (int n = 0; n < info_ptr->unknown_chunks_num; ++n)
{
    printf("%s,%d\n",info_ptr->unknown_chunks[n].name,  (int)info_ptr->unknown_chunks[n].size);
}
png\u未知\u chunkp未知;
int num_unknowns=(int)png_get_unknown_块(png_ptr、info_ptr和unknowns);
printf(“%d-----\n”,(int)num\u未知数);
printf(“%d\n”,(int)info\u ptr->unknown\u chunks\u num);
对于(int n=0;nunknown\u chunks\u num;++n)
{
printf(“%s,%d\n”,信息块->未知块[n].name,(int)信息块->未知块[n].size);
}
Foo
已消失

说:

您可以使用png_set_unknown_chunks函数将要写入的块排队。给它一个块名、原始数据和大小;就这些。块将由下面的png\u write\u info\u before\u PLTE、png\u write\u info或png\u write\u end函数写入。以前读入信息结构的未知块列表的任何块也将以满足PNG规范的排序规则的顺序写出


您是否调用它提到的三个png_write_*函数中的任何一个?png\u set\u unknown\u块本身似乎不执行写入操作。

是的,看起来写入操作实际上没有被调用(如fp所述)。另外,根据png_unknown_chunk的定义

typedef struct png_unknown_chunk_t {
    png_byte name[5];
    png_byte *data;
    png_size_t size;
} png_unknown_chunk;
您不需要执行第一个memcpy

memcpy(chunks[0].data,&foo,sizeof(Foo)*1);
因为前一行已经将块的数据指针设置为foo的位置。请注意,此函数已在堆栈上定义了foo,因此必须在此函数内执行写入操作,以确保foo仍然有效。

我编辑了您的帖子以交换代码块的标记,将来如果您打印代码,请尝试使用代码块(只需突出显示文本并按下“10101”按钮)…这样我们可以得到一些基本的语法高亮显示。