C++ 保存PNG图像
保存png图像时遇到问题 我想在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
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”按钮)…这样我们可以得到一些基本的语法高亮显示。