2009-09-24 13 views

risposta

2

Si dovrebbe dare un'occhiata alla trasformazione dell'immagine utilizzando le matrici.

In particolare, this article descrive come convertire una bitmap in scala di grigi utilizzando uno ColorMatrix. (È scritto in VB.NET, ma dovrebbe essere abbastanza facile da tradurre in C#).

Non ho provato se funziona con il canale alfa, ma direi che vale la pena provare, ed è sicuramente un modo rapido ed efficace per modificare le bitmap.

+2

L'ho usato su System.Drawing.Image e funziona benissimo. Non è l'ideale per le immagini WPF a meno che non si convertano bitmap GDI in BitmapSources. – Zooba

+0

La mia esperienza con WPF è molto limitata, quindi probabilmente hai ragione. – bernhof

+0

Contrassegnare questo come risposta in quanto sono stato costretto a utilizzare Bitmap GDI e convertirli in Bitmap di WPF. Modifica post. –

1

se l'affidamento su chiamate API non riesce. Puoi sempre provare l'approccio "fai da te": accedi ai byte RGBA dell'immagine e per ogni RGBA sostituiscilo con MMMA, dove M = (R + G + B)/3;

Se lo si desidera più perfetto, è necessario aggiungere pesi al contributo dei componenti RGB. Credo che i tuoi occhi siano più ricettivi per il verde e, in quanto tale, il valore dovrebbe pesare di più.

+0

Grazie per quello. Sto esaminando la classe WriteableBitmap come il modo più semplice per accedere direttamente ai pixel. –

0

Anche se non esattamente semplice e veloce, uno ShaderEffect svolgerebbe il lavoro ed eseguirà abbastanza bene. L'ho fatto da solo, e funziona benissimo. This article riferimenti su come farlo e ha associato l'origine. Non ho usato la sua fonte, quindi non posso garantire per questo. Se incontri dei problemi, chiedi, e potrei essere in grado di pubblicare parte del mio codice.

Non tutti i giorni si utilizza HLSL nella propria app LOB. :)

+0

Come parte ... presumendo che tu voglia visualizzare l'immagine nella tua app dopo averla convertita in scala di grigi.Se si desidera eseguire questa operazione come passaggio di elaborazione dell'immagine e quindi salvare l'immagine o qualcosa, potrebbe esserci più lavoro per cercare di far funzionare uno ShaderEffect al di fuori della pipeline dell'effetto WPF. A quel punto, GDI o una delle altre risposte potrebbero essere la soluzione migliore, comunque. – dustyburwell

2

Dipende davvero da ciò che è la fonte PixelFormat. Supponendo che la tua fonte sia PixelFormats.Bgra32 e che tu voglia andare in scala di grigi, potresti prendere in considerazione l'utilizzo di un formato pixel di destinazione di PixelFormats.Gray16. Tuttavia, Gray16 non supporta alpha. Ha appena 65.535 voti tra bianco e nero, inclusi.

Hai alcune opzioni. Uno è di stare con Bgra32 e basta impostare i canali blu, verde e rosso sullo stesso valore. In questo modo puoi mantenere il canale alfa. Questo può essere uno spreco se non si richiede un canale alfa a 8 bit (per diversi livelli di alfa per pixel).

Un'altra opzione è utilizzare un formato pixel indicizzato come PixelFormats.Indexed8 e creare una tavolozza che contenga i colori grigi necessari e i valori alfa. Se non hai bisogno di miscelare alpha, puoi rendere il colore della tavolozza a zero posizione essere completamente trasparente (un alfa di zero) e poi progredire in nero solido da indice 1 a bianco in 255.

Problemi correlati