2008-12-30 11 views
9
Image.FromFile(@"path\filename.tif") 

o¿Cómo abrir una imagen de formato de imagen TIFF de múltiples cuadros en .NET 2.0?

Image.FromStream(memoryStream) 

ambos producen objetos de imagen con sólo un marco a pesar de que la fuente es un archivo TIFF de múltiples cuadros. ¿Cómo se carga un archivo de imagen que conserva estos marcos? Los tiffs se guardan utilizando los métodos Image.SaveAdd cuadro por cuadro. Funcionan en otros visores pero los métodos de imagen .NET no cargarán estos marcos, solo el primero.

¿Significa esto que no hay forma de devolver un TIFF de múltiples cuadros desde un método en el que estoy pasando una colección de mapas de bits para utilizarlos como marcos?

Respuesta

22

Esto es lo que yo uso:

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; 
} 
+0

¿Significa esto que no hay forma de devolver un TIFF de varios fotogramas de un método en el que estoy pasando una colección de mapas de bits para usarlos como fotogramas? – mirezus

+1

Bastante si, hay que recordar que en un TIFF de multitrama cada cuadro puede tener su propio conjunto de opciones de codificación (compresión, color, calidad). Los mapas de bits por otro lado son animales mucho más simples. –

0

Bitmap.Dispose();

After For loop debe deshacerse del mapa de bits. De lo contrario, obtendrá un "archivo de error usando otro proceso" cuando intente usar el mismo archivo en otro proceso.

1

Pude manejar el tiff multi-cuadro usando el siguiente método.

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(); 

No he probado la solución en .net 2.0 pero MSDN muestra que los miembros de la clase existen. Solucionó mi problema en .net 4.5.2.

Cuestiones relacionadas