保存PNG图像

时间:2010-02-20 05:22:57

标签: 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];
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已经消失。

2 个答案:

答案 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仍然有效。