Реализация фильтров Photoshop на C#
Вопрос
Я знаю, как их реализовать, но не знаю, следует ли применять преобразование попиксельно или есть другой способ повлиять на все изображение, используя один вызов и т. д.?
AFAIK Get.Set Pixel работает очень медленно.Я не уверен, сделали ли они это таким образом.
Итак, если в качестве простого случая речь идет о фильтре оттенков серого/обесцвечивания, как бы его написать?
Решение
Приходится блокировать изображение и дальше работать с памятью напрямую, минуя метод SetPixel.Глянь сюда или даже лучше здесь
Например, вы можете установить синий цвет на 255 следующим образом:
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.
Другие советы
Чтобы добиться еще большей производительности, вы можете воспользоваться реализацией эффектов пиксельного шейдера WPF, которая работает со всеми визуальными объектами .NET WPF, а не только с изображениями.
Взгляните на статью, объясняющую некоторые основные шаги реализации такого эффекта:
http://bursjootech.blogspot.com/2008/06/grayscale-effect-pixel-shader-effect-in.html