2010-11-01 17 views
5

estoy usando este fragmento de código para cargar varios archivos de imagen:WPF BitmapImage y TIFF con CMYK + Alfa

BitmapImage bitmap = new BitmapImage(); 
bitmap.BeginInit(); 
bitmap.UriSource = new System.Uri (path); 
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
bitmap.EndInit(); 

Esto funciona bien para los archivos TIFF almacenados como RGB, RGB y CMYK + Alfa. Sin embargo, si intento cargar un archivo TIFF utilizando colores CMYK y un canal alfa, recibo una excepción (el decodificador no reconoce el formato de archivo).

Anteriormente estaba usando la biblioteca FreeImage y un envoltorio C# delgado en la parte superior. FreeImage 3.x tiene soporte parcial para este tipo de formato de imagen, es decir, tuve que cargar el TIFF dos veces, una vez como CMYK sin transparencia y una vez como RGB + Alpha; este truco es necesario ya que FreeImage solo da acceso a un máximo de 4 canales de color simultáneos.

Me gustaría saber si hay una forma admitida de cargar CMYK + Alpha bitmaps? Ya sea directamente en C# o pasando por algún código de interoperabilidad, pero preferiblemente sin tener que usar una DLL de terceros (que no sean las bibliotecas de marcos de .NET 4).

Se puede encontrar un ejemplo de un archivo TIFF como este here.

EDITAR: ya no puedo reproducir el problema, el siguiente código funciona bien:

BitmapImage bitmap = new BitmapImage(); 
bitmap.BeginInit(); 
bitmap.UriSource = new System.Uri (path); 
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
bitmap.EndInit(); 
byte[] pixels = new byte[bitmap.PixelHeight*bitmap.PixelWidth*5]; 
bitmap.CopyPixels (pixels, bitmap.PixelWidth * 5, 0); 

Pero no lo consigo: ¿cómo puedo saber que la imagen de la fuente se codifica como CMYK más ¿Canal alfa? Al mirar la propiedad Format, obtengo solo la información de que la imagen tiene 40 bits por píxel. Todo el material interesante se almacena en las siguientes propiedades no públicas:

bitmap.Format.FormatFlags == IsCMYK | NChannelAlpha; 
bitmap.Format.HasAlpha == true; 

¿Hay alguna forma oficial de llegar a ellos, sin tener que recurrir a la reflexión?

+0

¿Tiene algún enlace a un TIFF usando CMYK con canal alfa donde ocurre este problema? No puedo reproducir este –

+0

Agregué un enlace a mi imagen TIFF en la pregunta (http://www.opac.ch/files/cmyka.tif) –

+0

Ah, tienes razón. Lo siento, lo extrañé por completo ... –

Respuesta

0

Solo puedo decir esto porque he tenido problemas con algunos archivos: podría ser una mejor forma de convertir el tiff a png24 primero y luego cargarlo.

Incluso Photoshop pone una advertencia si un usuario intenta guardar un archivo CMYK Tiff y marca "Transparencia": "Muchos programas no admiten la transparencia en TIFF. ¿Guardar información de transparencia?"

Por lo tanto, la conversión antes de la apertura puede ser la manera más segura de hacerlo.

Tal vez http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspx lo haría pero lo dudo, es probable que necesite un poco de tubería adicional.

HTH.

+0

La conversión de la imagen no funciona (el convertidor de imágenes no parece ser compatible con mis imágenes CMYK + de canal alfa). Y no quiero convertir a RGB primero, ya que realmente necesito acceder a los cinco componentes para cada píxel (cian, magenta, amarillo, negro y alfa). –

+0

@kyle: Estaba equivocado, el código funciona. No tengo idea de por qué anteriormente recibía una excepción. –

+0

Me alegra escuchar. Bien viejo, reconstruye todo. – keyle

0

Es solo una suposición, pero GDI + podría cargar dichos archivos.

System.Drawing.Image etc.

Hay una clase de interoperabilidad que puede hacer que GDI + imágenes en WPF.

+0

No he encontrado cómo hacerlo. Por lo que entiendo, GDI + siempre me devuelve valores RGB y no hay forma de llegar a los valores CMYK originales. ¿O estoy equivocado? –

+0

En realidad, no tengo idea. Solo utilicé este enfoque para obtener imágenes de TWAIN y desglosarlas en WPF. –

0

me encontré con otra pregunta sobre el SO que unía a esta biblioteca:

http://freeimage.sourceforge.net/

Good Tiff library for .NET

espero que esto podría ayudar.

+1

Gracias, pero vengo de FreeImage y no quiero volver atrás; Tenía demasiados problemas cuando la memoria se estaba agotando. Observé muchos bloqueos en mi aplicación cuando llamé a FreeImage, muy probablemente debido a la corrupción de la memoria. Pero libtiff.net parece una alternativa interesante. –