Редактировать многостраничное изображение TIFF с помощью System.Drawing

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

Как я могу редактировать многостраничный tiff?


person Tamir    schedule 25.08.2009    source источник


Ответы (4)


Ошибка: Объект Graphics не может быть создан из изображения с индексированным пиксельным форматом.

... не имеет ничего общего с тем, что это многостраничный TIFF. Индексированный формат изображения означает, что оно имеет палитру цветов, например. это 256-цветное изображение. 1-битное изображение (ч/б) также будет считаться имеющим палитру из 2 цветов.

Вы не можете выполнять Graphics операции с изображениями, использующими палитру, их необходимо сначала преобразовать в 15-битную или более глубину цвета.

person Kieren Johnstone    schedule 30.08.2011

Я написал что-то, чтобы извлечь отдельные страницы из многостраничного файла TIFF.

// Load as Bitmap
using (Bitmap bmp = new Bitmap(file))
{
    // Get pages in bitmap
    int frames = bmp.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
    bmp.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, tiffpage);
    if (bmp.PixelFormat != PixelFormat.Format1bppIndexed)
    {
        using (Bitmap bmp2 = new Bitmap(bmp.Width, bmp.Height))
        {
            bmp2.Palette = bmp.Palette;
            bmp2.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
            // create graphics object for new bitmap
            using (Graphics g = Graphics.FromImage(bmp2))
            {
                // copy current page into new bitmap
                g.DrawImageUnscaled(bmp, 0, 0);

                                // do whatever you migth to do
                ...

            }
        }
    }
}

Фрагмент загружает файл tif и извлекает одну страницу (номер в переменной tiffpage) в новое растровое изображение. Это не индексируется, и можно создать графический объект.

person Christian13467    schedule 25.08.2009
comment
Следует отметить, что в SelectActiveFrame tiffpage=0 будет страницей 1. - person Ben Walker; 04.03.2014

Вот ссылка на образец CodeProject, который включает код для преобразования файла TIFF в обычное растровое изображение, с которым затем можно работать, как с любым другим растровым изображением:

http://www.codeproject.com/KB/GDI-plus/BitonalImageConverter.aspx

person MusiGenesis    schedule 25.08.2009

Однажды я написал небольшую утилиту для создания зашифрованных PDF-файлов из изображений в формате TIFF. Вот фрагмент кода для получения страниц из изображения tiff:

var bm= new System.Drawing.Bitmap('tif path');
var total = bm.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
for(var x=0;x<total;x++)
{
    bm.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page,x);
    var img=Image.GetInstance(bm,null,false);

    //do what ever you want with img object
}
person TheVillageIdiot    schedule 25.08.2009
comment
Я не могу найти метод GetInstance из изображения? - person Tamir; 25.08.2009