亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C#
LEATH 2019-08-19 10:51:08
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;}
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

位圖操作在C#中如此慢的原因是由于鎖定和解鎖。每個操作都將對所需位執行鎖定,操作位,然后解鎖位。

您可以自己處理操作,從而大大提高速度。請參閱以下示例。

using (var tile = new Bitmap(tilePart.Width, tilePart.Height)){
  try
  {
      BitmapData srcData = sourceImage.LockBits(tilePart, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
      BitmapData dstData = tile.LockBits(new Rectangle(0, 0, tile.Width, tile.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

      unsafe
      {
          byte* dstPointer = (byte*)dstData.Scan0;
          byte* srcPointer = (byte*)srcData.Scan0;

          for (int i = 0; i < tilePart.Height; i++)
          {
              for (int j = 0; j < tilePart.Width; j++)
              {
                  dstPointer[0] = srcPointer[0]; // Blue
                  dstPointer[1] = srcPointer[1]; // Green
                  dstPointer[2] = srcPointer[2]; // Red
                  dstPointer[3] = srcPointer[3]; // Alpha

                  srcPointer += BytesPerPixel;
                  dstPointer += BytesPerPixel;
              }
              srcPointer += srcStrideOffset + srcTileOffset;
              dstPointer += dstStrideOffset;
          }
      }

      tile.UnlockBits(dstData);
      aSourceImage.UnlockBits(srcData);

      tile.Save(path);
  }
  catch (InvalidOperationException e)
  {

  }}


查看完整回答
反對 回復 2019-08-19
?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

已經有一段時間了,但我發現了一個可能有用的例子。

  BitmapData BtmpDt = a.LockBits(new Rectangle(0,0,btm.Width,btm.Height),ImageLockMode.ReadWrite,btm.PixelFormat);
  IntPtr pointer = BtmDt.Scan0;
  int size = Math.Abs(BtmDt.Stride)*btm.Height;
  byte[] pixels = new byte[size];
  Marshal.Copy(pointer,pixels,0, size);
  for (int b = 0; b < pixels.Length; b++) {
    pixels[b] = 255;// do something here 
  }
  Marshal.Copy(pixels,0,pointer, size);
  btm.UnlockBits(BtmDt);

其中btm是一個Bitmap變量。


查看完整回答
反對 回復 2019-08-19
  • 3 回答
  • 0 關注
  • 720 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號