制作负片照片的时间很长

  • 本文关键字:时间 照片 c# graphics
  • 更新时间 :
  • 英文 :


与普通图片编辑器相比,这种方法需要很长时间来处理,这是为什么?

public Image InvertColor(Image img)
    {
        Bitmap bmp = new Bitmap(img);
        for (int i = 0; i < bmp.Width; i++)
        {
            for (int j = 0; j < bmp.Height; j++)
            {
                bmp.SetPixel(i, j,
                    Color.FromArgb(
                    byte.MaxValue - bmp.GetPixel(i, j).R,
                    byte.MaxValue - bmp.GetPixel(i, j).G,
                    byte.MaxValue - bmp.GetPixel(i, j).B));
            }
        }
        return (Image)bmp;
    }
这是快速

的方法。它使用ColorMatrix,基本上根本不需要时间,即使对于大Images也是如此。

private Image fastInvert(Image img)
{
    float[][] cm = new float[][]
    {
        new float[] {-1, 0, 0, 0, 0},
        new float[] {0, -1, 0, 0, 0},
        new float[] {0, 0, -1, 0, 0},
        new float[] {0, 0, 0, 1, 0},
        new float[] {1, 1, 1, 0, 1}
    };
    ColorMatrix CM = new ColorMatrix(cm);
    ImageAttributes ia = new ImageAttributes();
    ia.SetColorMatrix(CM);
    using ( Graphics g = Graphics.FromImage(img) )
        g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0,
            img.Width, img.Height, GraphicsUnit.Pixel, ia);
    return img;
      
}

矩阵数据是对Visual Kicks的赞誉,他们做对了,而不是我发现的任何其他网站,包括鲍勃鲍威尔的网站,他的更新确实是一个黑客,甚至对我不起作用。

这是因为GetPixelSetPixel方法很慢。不是很慢,但是因为您正在执行如此多的呼叫,因此开销会增加。

您可以从为每个像素仅调用一次GetPixel而不是三次开始:

public Image InvertColor(Image img) {
  Bitmap bmp = new Bitmap(img);
  for (int i = 0; i < bmp.Width; i++) {
    for (int j = 0; j < bmp.Height; j++) {
       Color source = bmp.GetPixel(i, j);
       bmp.SetPixel(i, j,
         Color.FromArgb(
           byte.MaxValue - source.R,
           byte.MaxValue - source.G,
           byte.MaxValue - source.B
         )
       );
    }
  }
  return (Image)bmp;
}

这应该使它的速度大约快两倍。为了更快地获得它,您需要直接访问图像数据。可以使用 LockBits 方法获取指向图像数据的指针。

相关内容

  • 没有找到相关文章

最新更新