Implementazione di filtri di Photoshop in C #
Domanda
Io so come implementare loro, ma quello che non so è se applicare il pixel per pixel trasformazione o c'è un altro modo per influenzare l'intera immagine, utilizzando una singola chiamata, etc?
Per quanto ne sappia Get.Set Pixel è molto lenta. Non sono sicuro se lo hanno fatto in questo modo.
Quindi, se è la scala di grigi / desaturare filtro come un caso semplice, come si potrebbe scriverlo?
Soluzione
È necessario per bloccare l'immagine e poi lavorare con la memoria bypassando direttamente metodo SetPixel. Vedi qui o ancora meglio qui
Per examle è possibile impostare il colore blu a 255 come segue
BitmapData bmd=bm.LockBits(new Rectangle(0, 0, 10, 10), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat);
int PixelSize=4;
for(int y=0; y<bmd.Height; y++)
{
byte* row=(byte *)bmd.Scan0+(y*bmd.Stride);
for(int x=0; x<bmd.Width; x++)
{
row[x*PixelSize]=255;
}
} // it is copied from the last provided link.
Altri suggerimenti
Al fine di ottenere una performance ancora più veloce, si consiglia di controllare l'attuazione Pixel Shader Effects di WPF, che funziona con tutti gli oggetti visivi .NET WPF, non solo immagini.
Date un'occhiata a un articolo che spiega alcuni passaggi fondamentali di attuazione per un tale effetto: