Создание многостраничного TIFF не работает

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

picture.SelectActiveFrame(FrameDimension.Page, 0);
var image = new Bitmap(picture);
using (var stream = new MemoryStream())
{
    ImageCodecInfo codecInfo = null;
    foreach (var imageEncoder in ImageCodecInfo.GetImageEncoders())
    {
        if (imageEncoder.MimeType != "image/tiff") continue;
        codecInfo = imageEncoder;
        break;
    }
    var parameters = new EncoderParameters
    {
        Param = new []
        {
            new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.MultiFrame)
        }
    };
    image.Save(stream, codecInfo, parameters);

    parameters = new EncoderParameters
    {
        Param = new[]
        {
            new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.FrameDimensionPage)
        }
    };
    for (var i = 1; i < picture.GetFrameCount(FrameDimension.Page); i++)
    {
        picture.SelectActiveFrame(FrameDimension.Page, i);
        var img = new Bitmap(picture);
        image.SaveAdd(img, parameters);

    }
    
    parameters = new EncoderParameters
    {
        Param = new[] 
        {
            new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush) 
        }
    };
    image.SaveAdd(parameters);
    stream.Flush();
}

Но он не работает (в изображение включен только первый кадр) и я не знаю, почему.

Что я хочу сделать, так это изменить конкретный кадр файла TIFF (добавить к нему аннотации).

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


person Beatles1692    schedule 24.01.2010    source источник
comment
Объясните, пожалуйста, не работает. Что происходит, что не получается, какую ошибку (если есть) вы получаете?   -  person Benjamin Podszun    schedule 24.01.2010
comment
Он создает объект изображения только с первым кадром, остальные кадры не добавляются.   -  person Beatles1692    schedule 24.01.2010
comment
Ваш код работал нормально, когда я пробовал. Вы убедились, что исходное изображение состоит из нескольких страниц? Правильно ли вы сохраняете MemoryStream?   -  person Hans Passant    schedule 24.01.2010
comment
Да, изображение, с которым я тестирую свой источник, является многостраничным. Кажется, что этот источник не работает с объектом изображения, но вместо этого в поток памяти внесено изменение, поэтому я должен сохранить свой поток памяти и вернуть его как изображение. Спасибо за ваша помощь   -  person Beatles1692    schedule 25.01.2010
comment
!! Ссылка битая!!   -  person TaW    schedule 07.04.2018


Ответы (2)


[удалена первая часть после комментария]

Я работаю с многостраничными файлами TIFF, используя LibTIFF.NET; Я обнаружил много недостатков в обработке TIFF с использованием стандартных библиотек (связанные с памятью, а также постоянные сбои на 16-битных изображениях в оттенках серого).

Какое у вас тестовое изображение? Вы пробовали многокадровый tiff (желательно с большой «1» на первом кадре, «2» на следующем и т. д., это может помочь вам быть уверенным в кадре, включенном в файл.

Другой полезной диагностикой может быть утилита tiffdump, входящая в состав бинарников LibTiff (в том числе и для windows). Это точно скажет вам, какие кадры у вас есть.

См. раздел Использование LibTiff из c# для доступа к мозаичным изображениям TIFF.

[Edit] Если вы хотите разобраться в .NET: я нашел новый ресурс по многостраничным TIFF, использующим стандартную функциональность .NET (хотя я буду придерживаться LibTIFF.NET): TheCodeProject: сохранение изображений в многостраничный файл TIFF... Если вы загрузите его, фрагмент кода в функции saveMultipage(..) Form1.cs похож (но все же немного отличается) от вашего кода. Особенно промывка в конце делается по другому, и файл удаляется перед первым кадром... [/Edit]

person Adriaan    schedule 25.01.2010
comment
Спасибо, Адриан. Ваш ответ мне очень помог, потому что я не знал, что существует библиотека tiff с открытым исходным кодом. Я немедленно попробую. О цикле for: я использовал первый кадр для создания самого изображения: picture.SelectActiveFrame(FrameDimension.Page, 0); var image = новое растровое изображение (изображение); - person Beatles1692; 26.01.2010

Кажется, что этот процесс не изменяет объект изображения, но изменяет поток, поэтому я должен получить буфер потока памяти и создать другой объект изображения:

var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}

Теперь результат будет включать все кадры.

person Beatles1692    schedule 25.01.2010
comment
Привет, не могли бы вы обновить решение, которое сработало для вас? Я попробовал то, что вы предложили выше, но не работает для меня. - person seUser; 02.02.2016