Генерация многостраничного TIFF не работает - PullRequest
1 голос
/ 24 января 2010

Я пытаюсь сгенерировать многостраничный файл 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 из исходного изображения и добавление моего собственного изображения вместо этого кадра.

Ответы [ 2 ]

1 голос
/ 25 января 2010

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

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

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

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

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

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

0 голосов
/ 25 января 2010

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

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

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

...