Могу ли я изменить общее количество страниц в многостраничном формате? - PullRequest
0 голосов
/ 04 февраля 2020

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

TIFFSetField(out, TIFFTAG_PAGENUMBER, page_number, total_pages);

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

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

1 Ответ

0 голосов
/ 06 февраля 2020

На самом деле, решение довольно простое. Как только ваш поток изображений закончится и перед тем, как вы закроете файл, вы должны пройти по всем каталогам (изображения в многостраничном формате) и обновить TIFFTAG_PAGENUMBER до общего количества написанных страниц. Загвоздка в том, что вы должны сделать это прежде, чем закроете tiff, позвонив по номеру TIFFClose. Когда TIFF закрыт, его TAGS больше нельзя редактировать. (см. 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 - это количество страниц, которые мы фактически записали в файл

...