Вопрос

Я знаю, как их реализовать, но не знаю, следует ли применять преобразование попиксельно или есть другой способ повлиять на все изображение, используя один вызов и т. д.?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top