Создание многостраничного 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 из исходного изображения и добавить свое собственное изображение вместо этого кадра.
Решение 2
Кажется, что этот процесс не меняет объект изображения, но меняет поток, поэтому мне нужно получить буфер потока памяти и построить другой объект изображения:
var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}
Теперь результат будет включать все кадры.
Другие советы
[удалена первая часть после комментария]
Я работаю с многостраничными TIFF, используя LibTIFF.NET;Я обнаружил много хитростей в обработке TIFF с использованием стандартных библиотек (связанных с памятью, а также постоянных сбоев на 16-битных изображениях в оттенках серого).
Какое у вас тестовое изображение?Пробовали ли вы многокадровый TIFF (желательно с большой цифрой «1» в первом кадре, цифрой «2» в следующем и т. д.);это может помочь вам быть уверенным в кадре, включенном в файл.
Еще одной полезной диагностикой может быть утилита tiffdump, включенная в двоичные файлы LibTiff (также для Windows).Это точно скажет вам, какие у вас кадры.
Видеть Использование LibTiff из С# для доступа к мозаичным изображениям tiff
[Редактировать] Если вы хотите понять материал .NET:Я нашел новый ресурс по многостраничным файлам tiff, использующий стандартную функциональность .NET (хотя я буду придерживаться LibTIFF.NET): КодПроект:Сохраняйте изображения в многостраничный файл TIFF... Если вы загрузите его, фрагмент кода в функции SaveMultipage(..) Form1.cs будет аналогичен (но все же немного отличается) от вашего кода.Тем более промывка в конце делается по другому, и файл удаляется до первого кадра...[/Редактировать]