2010-11-01 10 views
5

ich diesen Code-Schnipsel bin mit verschiedenen Bilddateien zu laden:WPF Bitmap und TIFF mit CMYK + Alpha

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

Dies funktioniert gut für TIFF-Dateien gespeichert, wie RGB, RGB + Alpha und CMYK. Wenn ich jedoch versuche, eine TIFF-Datei mit CMYK-Farben und einem Alpha-Kanal zu laden, erhalte ich eine Ausnahme (das Dateiformat wird vom Dekoder nicht als gültig erkannt).

Ich war zuvor mit der FreeImage-Bibliothek und einem dünnen C# -Wrapper oben drauf. FreeImage 3.x hat teilweise Unterstützung für diese Art von Bildformat, d. H. Ich musste das TIFF zweimal laden, einmal als CMYK ohne Transparenz und einmal als RGB + Alpha; Dieser Trick wird benötigt, da FreeImage nur Zugriff auf maximal 4 gleichzeitige Farbkanäle bietet.

Ich würde gerne wissen, ob es eine unterstützte Möglichkeit gibt, CMYK + Alpha-Bitmaps zu laden? Entweder direkt in C# oder indem man einen Interop-Code durchläuft, aber vorzugsweise ohne eine DLL eines Drittanbieters (anders als die .NET 4-Framework-Bibliotheken) zu verwenden.

Ein Beispiel für eine solche TIFF-Datei finden Sie here.

EDIT: Ich nicht mehr das Problem reproduzieren kann, der folgende Code funktioniert gut:

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

Aber ich bin immer noch fest: wie ich, dass das Quellbild als CMYK-codierte herausfinden kann, und Alphakanal? Wenn ich auf die Format Eigenschaft schaue, bekomme ich nur die Information, dass das Bild 40 Bits pro Pixel hat. Alle interessanten Sachen wird in den folgenden nicht-öffentlichen Eigenschaften gespeichert:

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

Gibt es einen offiziellen Weg, um sie zu bekommen, ohne zu Reflexion zurückgreifen?

+0

Haben Sie eine Verbindung zu einem TIFF mit CMYK mit Alpha-Kanal, wo dieses Problem auftritt? Ich kann das nicht reproduzieren –

+0

Ich habe einen Link zu meinem TIFF-Bild in der Frage hinzugefügt (http://www.opac.ch/files/cmyka.tif) –

+0

Ah, du hast Recht. Sorry, total verpasst .. –

Antwort

0

Ich kann das nur sagen, weil ich die Probleme mit einigen Dateien hatte: es könnte eine bessere Möglichkeit sein, das TIFF zuerst in png24 umzuwandeln und dann zu laden.

Sogar Photoshop gibt eine Warnung aus, wenn ein Benutzer versucht, eine CMYK-Tiff-Datei zu speichern und "Transparenz" ankreuzen: "Viele Programme unterstützen keine Transparenz in TIFF. Transparenzinformationen speichern?"

Die Konvertierung vor dem Öffnen könnte also der sicherste Weg sein.

Vielleicht http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspx würde es tun, aber ich bezweifle es, Sie brauchen wahrscheinlich einige zusätzliche Rohrleitungen.

HTH.

+0

Konvertieren des Bildes funktioniert nicht (der Bildkonverter scheint meine CMYK + Alphakanalbilder nicht zu unterstützen). Und ich möchte nicht zuerst zu RGB konvertieren, da ich wirklich auf alle fünf Komponenten für jedes Pixel (Cyan, Magenta, Gelb, Schwarz und Alpha) zugreifen muss. –

+0

@ kyle: Ich habe mich geirrt, der Code funktioniert. Ich habe keine Ahnung, warum ich vorher eine Ausnahme bekommen habe. –

+0

Freut mich zu hören. Gute alte alles neu zu bauen. – keyle

0

Es ist nur eine Vermutung, aber GDI + kann solche Dateien möglicherweise laden.

System.Drawing.Image usw.

Es gibt eine Interop-Klasse, die GDI + Bilder in WPF machen kann.

+0

Ich habe nicht gefunden, wie man das macht. Soweit ich weiß, gibt GDI + immer RGB-Werte an mich zurück und es gibt keine Möglichkeit, zu den ursprünglichen CMYK-Werten zu gelangen. Oder liege ich falsch? –

+0

Eigentlich habe ich keine Ahnung. Ich habe diesen Ansatz nur verwendet, um Bilder von TWAIN zu erhalten und sie in WPF anzuzeigen. –

0

fand ich eine andere Frage auf SO, die zu dieser Bibliothek verknüpft:

http://freeimage.sourceforge.net/

Good Tiff library for .NET

Ich hoffe, dass dies helfen könnte.

+1

Danke, aber ich bin von FreeImage gekommen und möchte nicht zurückgehen. Ich hatte zu viele Probleme, wenn die Erinnerung knapp wurde. Ich habe viele Abstürze in meiner Anwendung beim Aufruf von FreeImage beobachtet, wahrscheinlich verursacht durch Speicherbeschädigung. Aber das libtiff.net scheint eine interessante Alternative zu sein. –