C# - 用于Windows窗体应用程序的BitPps的SetPixel和GetPixel的更快替

C# - 用于Windows窗体应用程序的BitPps的SetPixel和GetPixel的更快替代品

我正在尝试自学C#,并从各种来源听说函数get和setpixel可能非常慢。有哪些替代方案,性能改进真的那么重要吗?提前致谢!

我的一大块代码供参考:

public static Bitmap Paint(Bitmap _b, Color f){
  Bitmap b = new Bitmap(_b);
  for (int x = 0; x < b.Width; x++) 
  {
    for (int y = 0; y < b.Height; y++) 
    {
      Color c = b.GetPixel(x, y);
      b.SetPixel(x, y, Color.FromArgb(c.A, f.R, f.G, f.B));
    }
  }
  return b;}


LEATH
浏览 651回答 3
3回答

慕无忌1623718

位图操作在C#中如此慢的原因是由于锁定和解锁。每个操作都将对所需位执行锁定,操作位,然后解锁位。您可以自己处理操作,从而大大提高速度。请参阅以下示例。using&nbsp;(var&nbsp;tile&nbsp;=&nbsp;new&nbsp;Bitmap(tilePart.Width,&nbsp;tilePart.Height)){ &nbsp;&nbsp;try &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitmapData&nbsp;srcData&nbsp;=&nbsp;sourceImage.LockBits(tilePart,&nbsp;ImageLockMode.ReadOnly,&nbsp;PixelFormat.Format32bppArgb); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitmapData&nbsp;dstData&nbsp;=&nbsp;tile.LockBits(new&nbsp;Rectangle(0,&nbsp;0,&nbsp;tile.Width,&nbsp;tile.Height),&nbsp;ImageLockMode.ReadWrite,&nbsp;PixelFormat.Format32bppArgb); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsafe &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte*&nbsp;dstPointer&nbsp;=&nbsp;(byte*)dstData.Scan0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte*&nbsp;srcPointer&nbsp;=&nbsp;(byte*)srcData.Scan0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;tilePart.Height;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;tilePart.Width;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dstPointer[0]&nbsp;=&nbsp;srcPointer[0];&nbsp;//&nbsp;Blue &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dstPointer[1]&nbsp;=&nbsp;srcPointer[1];&nbsp;//&nbsp;Green &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dstPointer[2]&nbsp;=&nbsp;srcPointer[2];&nbsp;//&nbsp;Red &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dstPointer[3]&nbsp;=&nbsp;srcPointer[3];&nbsp;//&nbsp;Alpha &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srcPointer&nbsp;+=&nbsp;BytesPerPixel; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dstPointer&nbsp;+=&nbsp;BytesPerPixel; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;srcPointer&nbsp;+=&nbsp;srcStrideOffset&nbsp;+&nbsp;srcTileOffset; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dstPointer&nbsp;+=&nbsp;dstStrideOffset; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tile.UnlockBits(dstData); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aSourceImage.UnlockBits(srcData); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tile.Save(path); &nbsp;&nbsp;} &nbsp;&nbsp;catch&nbsp;(InvalidOperationException&nbsp;e) &nbsp;&nbsp;{ &nbsp;&nbsp;}}

杨魅力

已经有一段时间了,但我发现了一个可能有用的例子。&nbsp;&nbsp;BitmapData&nbsp;BtmpDt&nbsp;=&nbsp;a.LockBits(new&nbsp;Rectangle(0,0,btm.Width,btm.Height),ImageLockMode.ReadWrite,btm.PixelFormat); &nbsp;&nbsp;IntPtr&nbsp;pointer&nbsp;=&nbsp;BtmDt.Scan0; &nbsp;&nbsp;int&nbsp;size&nbsp;=&nbsp;Math.Abs(BtmDt.Stride)*btm.Height; &nbsp;&nbsp;byte[]&nbsp;pixels&nbsp;=&nbsp;new&nbsp;byte[size]; &nbsp;&nbsp;Marshal.Copy(pointer,pixels,0,&nbsp;size); &nbsp;&nbsp;for&nbsp;(int&nbsp;b&nbsp;=&nbsp;0;&nbsp;b&nbsp;<&nbsp;pixels.Length;&nbsp;b++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;pixels[b]&nbsp;=&nbsp;255;//&nbsp;do&nbsp;something&nbsp;here&nbsp; &nbsp;&nbsp;} &nbsp;&nbsp;Marshal.Copy(pixels,0,pointer,&nbsp;size); &nbsp;&nbsp;btm.UnlockBits(BtmDt);其中btm是一个Bitmap变量。
打开App,查看更多内容
随时随地看视频慕课网APP