Pergunta

Eu sei como implementá-los, mas o que eu não sei é se aplicar o pixel transformação por pixel ou existe outra maneira de afetar a imagem inteira, usando uma única chamada, etc?

AFAIK Get.Set Pixel é muito lento. Eu não tenho certeza se eles fizeram isso desta forma.

Então, se é o filtro de tons de cinza / desaturate como um caso simples, como seria um escrevê-lo?

Foi útil?

Solução

Você tem que bloquear a imagem e, em seguida, trabalho com a memória diretamente ignorando método SetPixel. Veja aqui ou ainda melhor aqui

Para examle você pode definir a cor azul a 255 como 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.

Outras dicas

A fim de alcançar um desempenho ainda mais rápido, você pode querer verificar a implementação Pixel Shader Efeitos do WPF, que trabalha com todos os objetos visuais .NET WPF, não apenas imagens.

Dê uma olhada em um artigo explicando alguns passos básicos de implementação para tal efeito:

http: //bursjootech.blogspot. com / 2008/06 / tons de cinza-efeito-pixel-shader-efeito-in.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top