La mise en œuvre des filtres Photoshop en C #
Question
Je sais comment les mettre en œuvre, mais ce que je ne sais pas est d'appliquer ou non le pixel de transformation par pixel ou est-il une autre façon d'affecter l'image, en utilisant un seul appel, etc?
Get.Set Pixel est AFAIK très lent. Je ne sais pas s'ils l'ont fait ainsi.
Donc, si c'est le filtre en niveaux de gris / désaturer comme un simple cas, comment peut-on écrire?
La solution
Vous devez verrouiller l'image, puis travailler avec la mémoire sans passer directement méthode SetPixel. Voir ici ou mieux encore ici
Pour examle vous pouvez définir la couleur bleue à 255 comme suit
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.
Autres conseils
Afin d'obtenir une performance encore plus rapide, vous pouvez vérifier la mise en œuvre Pixel Shader Effets de WPF, qui fonctionne avec tous les objets visuels WPF .NET, et pas seulement des images.
Jetez un oeil à un article expliquant certaines étapes de mise en œuvre de base pour un tel effet:
http: //bursjootech.blogspot. com / 2008/06 / niveaux de gris-effet pixel-shader effet in.html