我在保存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);
}
以上显示缓冲区已正确更新,我的数据嵌入到图像中.I
然而,当我后来加载它时,它就消失了。下面是我如何从保存的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);
}
Foo
已经消失。
答案 0 :(得分:2)
http://www.libpng.org/pub/png/libpng-1.2.5-manual.html说:
您可以使用png_set_unknown_chunks函数对要编写的块进行排队。你给它一个块名,原始数据和大小;这里的所有都是它的。这些块将由下一个png_write_info_before_PLTE,png_write_info或png_write_end函数写入。之前读入信息结构的未知块列表的任何块也将以满足PNG规范的排序规则的顺序写出。
你是否正在调用它提到的三个png_write_ *函数中的任何一个? png_set_unknown_chunks似乎没有写自己。
答案 1 :(得分:1)
是的,看起来实际上没有调用write(如提到的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仍然有效。