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 关注
- 748 浏览
添加回答
举报
0/150
提交
取消
