Сохранение изображений PNG - PullRequest
1 голос
/ 20 февраля 2010

У меня проблемы с сохранением изображений 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 ]

2 голосов
/ 25 февраля 2010

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 голос
/ 02 марта 2010

Да, похоже, что запись на самом деле не вызывается (как упоминалось в 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 остается действительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...