Как открыть многокадровое изображение в формате TIFF в .NET 2.0?

Image.FromFile(@"path\filename.tif")

or

Image.FromStream(memoryStream)

оба создают объекты изображения только с одним кадром, даже если источником является многокадровый файл TIFF. Как загрузить файл изображения, в котором сохраняются эти кадры? TIFF-файлы сохраняются кадр за кадром с помощью методов Image.SaveAdd. В других вьюверах они работают, но методы .NET Image не будут загружать эти кадры, только первый.

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


person mirezus    schedule 30.12.2008    source источник


Ответы (3)


Вот что я использую:

private List<Image> GetAllPages(string file)
{
    List<Image> images = new List<Image>();
    Bitmap bitmap = (Bitmap)Image.FromFile(file);
    int count = bitmap.GetFrameCount(FrameDimension.Page);
    for (int idx = 0; idx < count; idx++)
    {
        // save each frame to a bytestream
        bitmap.SelectActiveFrame(FrameDimension.Page, idx);
        MemoryStream byteStream = new MemoryStream();
        bitmap.Save(byteStream, ImageFormat.Tiff);

        // and then create a new Image from it
        images.Add(Image.FromStream(byteStream));
    }
    return images;
}
person Otávio Décio    schedule 30.12.2008
comment
Означает ли это, что нет способа вернуть многокадровый TIFF из метода, в котором я передаю набор растровых изображений для использования в качестве кадров? - person mirezus; 31.12.2008
comment
В значительной степени да - вы должны помнить, что в многокадровом TIFF каждый кадр может иметь свой собственный набор параметров кодирования (сжатие, цвет, качество). Растровые изображения, с другой стороны, гораздо проще. - person Otávio Décio; 31.12.2008

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

Image multiImage = Image.FromFile(sourceFile);

multiImage.Save(destinationFile, tiff, prams);

int pageCount = multiImage.GetFrameCount(FrameDimension.Page);

for (int page = 1; page < pageCount; page++ )
{
    multiImage.SelectActiveFrame(FrameDimension.Page,page);
    multiImage.SaveAdd(dupImage,prams);
}

multiImage.SaveAdd(newPage, prams);
multiImage.Dispose(); 

Я не пробовал решение в .net 2.0, но MSDN показывает, что члены класса существуют. Это решило мою проблему в .net 4.5.2.

person Chris    schedule 28.12.2016
comment
Что такое ДюпИмидж? - person Danish_k12; 27.04.2018

растровое изображение.Dispose();

После цикла For вам нужно удалить растровое изображение. В противном случае вы получите сообщение об ошибке «файл, использующий другой процесс», когда попытаетесь использовать тот же файл в другом процессе.

person Adem Canpolat    schedule 02.12.2016