Могу ли я изменить общее количество страниц в многостраничном TIFF?

Я получаю данные с камеры и сохраняю каждое изображение как страницу в многостраничном TIFF. Я могу установить, что каждый файл имеет, например. 100 страниц и я звоню:

TIFFSetField(out, TIFFTAG_PAGENUMBER, page_number, total_pages);

Однако, если я не смогу достаточно быстро записать данные на диск, я остановлю приобретение. К этому моменту я, возможно, написал 50 из 100 страниц в многостраничный TIFF. Теперь многостраничный TIFF-файл показывает общее количество страниц как 100, но на самом деле было записано только 50 страниц. Некоторые приложения сообщают о 100 страницах, но для страниц 51-100 данных не будет, и изображения будут казаться черными.

Поэтому мне нужно будет обновить число total_pages в тот момент, когда я заканчиваю запись на диск до значения последней записанной страницы. Это вообще можно сделать? Записывается ли значение total_pages один раз в общий заголовок, который я мог бы обновлять и исправлять файл таким образом, или это значение записывается в каждую страницу, что означает, что мне придется редактировать каждую страницу, которая уже была записана на диск? Или есть лучший подход, как справиться с этим?


person user2165039    schedule 04.02.2020    source источник


Ответы (1)


На самом деле решение довольно простое. После того, как ваш поток изображений закончился и прежде чем закрыть файл, вы должны перебрать все каталоги (изображения в многостраничном TIFF) и обновить TIFFTAG_PAGENUMBER до общего числа записанных страниц. Загвоздка в том, что вы должны сделать это до того, как закроете размолвку, вызвав TIFFClose. После закрытия файла TIFF его ТЕГИ больше нельзя редактировать. (см. http://www.libtiff.org/libtiff.html):

Обратите внимание, что, в отличие от библиотеки stdio, файлы изображений TIFF нельзя открывать как для чтения, так и для записи; нет поддержки изменения содержимого файла TIFF.

if (pagesTotal - pagesWritten > 0)
{
    for (int i = 0; i < pagesWritten; i++)
    {
         int retVal = TIFFSetDirectory(out, i);
         retVal = TIFFSetField(out, TIFFTAG_PAGENUMBER, i, pagesWritten);
         retVal = TIFFWriteDirectory(out);
     }
}
TIFFClose(out);

pagesTotal — это количество страниц, которые мы хотели записать в этот многостраничный файл.

pagesWritten — это количество страниц, которые мы фактически записали в файл

person user2165039    schedule 06.02.2020