libtiff.net разделить многостраничные TIFF на изображения TIFF одной страницы

1

Я пытаюсь использовать LibTiff.Net для разделения многостраничного изображения TIFF на одностраничные изображения TIFF.

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

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

Я также не хочу декодировать какой-либо контент изображения входного изображения, потому что это приведет к обработке времени обработки.

Возможно ли это с LibTiff.Net?

ОБНОВЛЕНО @Бобровский - спасибо за ваше предложение.

Вот что я пробовал. Я взял класс Copier из исходного кода для TiffCP, чтобы использовать его в моем проекте с нулевыми изменениями. Ниже приведен код, как я его использую. Когда этот код завершает выполнение, объекты MemoryStream, которые должны иметь весь одностраничный TIFF-образ внутри них, составляют ровно 1,282 байта. Кажется, что мне не хватает вызова функции, который заставляет данные изображения TIFF записываться в основное хранилище (в этом случае MemoryStream). Я включил вызов Flush(), чтобы попытаться исправить эту проблему, но это не повлияло. Кто-нибудь знает, что мне не хватает?

using (memoryStream)
{
    memoryStream.Position = 0;
    using (Tiff image = Tiff.ClientOpen("iqdoc", "r", memoryStream, new TiffStream()))
    {
        int totalPages = image.NumberOfDirectories();
        for (int i = 0; i < totalPages; i++)
        {
            image.SetDirectory((short)i);
            using (var ms = new MemoryStream())
            using (Tiff page = Tiff.ClientOpen("page", "w", ms, new TiffStream()))
            {
                var c = new Copier();
                c.m_compression = c.m_defcompression; // THIS WAS MISSING
                if (!c.Copy(image, page) || !page.WriteDirectory())
                    throw new ApplicationException("Failed to extract page from document for presentation.");

                FieldValue[] field = image.GetField(TiffTag.IMAGEWIDTH);
                int width = field[0].ToInt();

                field = image.GetField(TiffTag.IMAGELENGTH);
                int height = field[0].ToInt();

                page.Flush();

                pages.Add(new
                {
                    Height = height,
                    Width = width,
                    PageBytes = Convert.ToBase64String(ms.ToArray()),
                });

                c = null;
            }
        }
    }
}

Благодарю!

Теги:
tiff
libtiff.net

1 ответ

1
Лучший ответ

Да, это возможно. TiffCP делает это.

Вы можете взять TiffCP-код и адаптировать его к вашим потребностям (измените способ хранения вывода).

Вы также можете придумать другие идеи и реализовать один из них.

Вы не можете получить полное рабочее решение в ответе на этом сайте.

РЕДАКТИРОВАТЬ:

Ваш код в основном одобрен, но вы должны получить доступ только к байтам потока памяти после того, как Tiff закончил писать на него.

К сожалению, Tiff закрывает поток памяти в нем Dispose и Close методами. Вы можете попробовать два подхода для решения проблемы:

  • Вызовите Tiff.WriteDirectory перед доступом к байтам в потоке памяти. Это должно быть хорошо, но вы можете получить неполный TIFF в потоке.
  • Создайте собственный поток (на основе System.IO.MemoryStream), который перегружает метод Close с пустой реализацией и использует этот поток вместо MemoryStream. Доступ к байтам в этом потоке после Tiff.
  • 0
    спасибо за ваше предложение. Я обновил вопрос с некоторыми дополнительными деталями и новыми проблемами. Дайте мне знать, если у вас есть какие-либо советы для меня. Еще раз спасибо!
  • 0
    Спасибо за ответ. Я более подробно посмотрел на код в TiffCP и на то, как он использует класс Copier, и понял, что я не устанавливаю значения по умолчанию таким же образом. Я добавил недостающий код в свой вопрос, чтобы другие могли его увидеть. Могут быть и другие значения по умолчанию, которые мне нужно указать, но пока мои тестовые изображения CCITT4 работают нормально. Вот код, который я пропустил: c.m_compression = c.m_defcompression; // ЭТО ПРОШЛО

Ещё вопросы

Сообщество Overcoder
Наверх
Меню