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) { }}

楊魅力
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變量。
- 3 回答
- 0 關注
- 720 瀏覽
添加回答
舉報
0/150
提交
取消