2010-11-01 28 views
5

Sto usando questo frammento di codice per caricare i vari file di immagine:WPF BitmapImage e TIFF con CMYK + Alpha

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

Questo funziona bene per i file TIFF memorizzati come RGB, RGB + Alpha e CMYK. Tuttavia, se provo a caricare un file TIFF usando i colori CMYK e un canale alfa, ottengo un'eccezione (il formato del file non è riconosciuto valido dal decodificatore).

In precedenza utilizzavo la libreria FreeImage e un sottile involucro C#. FreeImage 3.x ha supporto parziale per questo tipo di formato immagine, cioè ho dovuto caricare il TIFF due volte, una volta come CMYK senza trasparenza e una volta come RGB + Alpha; questo trucco è necessario poiché FreeImage consente solo l'accesso a massimo 4 canali di colore simultanei.

Mi piacerebbe sapere se esiste un modo supportato per caricare bitmap CMYK + Alpha? O direttamente in C# o passando attraverso alcuni codici di interoperabilità, ma preferibilmente senza dover utilizzare una DLL di terze parti (diversa dalle librerie framework .NET 4).

Un esempio di un file TIFF può essere trovato here.

EDIT: non riesco più a riprodurre il problema, il seguente codice funziona bene:

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

Ma io sono ancora bloccato: come posso scoprire che l'immagine di origine è stato codificato come CMYK più Canale alfa? Quando guardo la proprietà Format, ottengo solo le informazioni che l'immagine ha 40 bit per pixel. Tutta la roba interessante è memorizzato nelle seguenti proprietà non pubblici:

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

C'è un modo ufficiale di arrivare a loro, senza ricorrere alla riflessione?

+0

Hai qualche collegamento a un TIFF utilizzando CMYK con canale alfa dove si verifica questo problema? Non riesco a riprodurre questo –

+0

Ho aggiunto un link alla mia immagine TIFF nella domanda (http://www.opac.ch/files/cmyka.tif) –

+0

Ah, hai ragione. Scusate, totalmente perso .. –

risposta

0

Posso solo dire questo perché ho avuto dei problemi con alcuni file: potrebbe essere un modo migliore per convertire da tiff a png24 prima e quindi caricarlo.

Anche Photoshop emette un avviso se un utente tenta di salvare un file Tiff CMYK e seleziona "Trasparenza": "Molti programmi non supportano la trasparenza in TIFF. Salvare le informazioni sulla trasparenza?"

Quindi la conversione prima dell'apertura potrebbe essere la strada sicura da percorrere.

Forse lo http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspx lo farebbe ma ne dubito, probabilmente è necessario un po 'di piping extra.

HTH.

+0

La conversione dell'immagine non funziona (il convertitore di immagini non sembra supportare le mie immagini di canale alfa CMYK +). E non voglio prima convertire in RGB, perché ho davvero bisogno di accedere a tutti e cinque i componenti per ogni pixel (ciano, magenta, giallo, nero e alfa). –

+0

@kyle: mi sono sbagliato, il codice funziona. Non ho idea del motivo per cui in precedenza stavo ottenendo un'eccezione. –

+0

Felice di ascoltare. Buon vecchio ricostruisci tutto. – keyle

0

È solo un'ipotesi, ma GDI + potrebbe essere in grado di caricare tali file.

System.Drawing.Image ecc

C'è una classe di interoperabilità che può rendere GDI + immagini in WPF.

+0

Non ho trovato come farlo. Da quanto ho capito, GDI + restituisce sempre i valori RGB e non c'è modo di ottenere i valori CMYK originali. O mi sbaglio? –

+0

In realtà non ne ho idea. Ho usato solo questo aaproach per ottenere immagini da TWAIN e riprodurle in WPF. –

0

ho trovato un'altra domanda su SO che collegava a questa raccolta:

http://freeimage.sourceforge.net/

Good Tiff library for .NET

Spero che questo potrebbe aiutare.

+1

Grazie, ma sono venuto da FreeImage e non voglio tornare indietro; Ho avuto troppi problemi quando la memoria si stava abbassando. Ho osservato molti arresti anomali nella mia applicazione quando ho chiamato FreeImage, probabilmente causato dalla corruzione della memoria. Ma il libtiff.net sembra un'alternativa interessante. –