我试图做一种Grahpics.DrawImage
实现使用不安全的代码和指针当然。C#绘制图像的实现
在这种情况下,即时通讯试图绘制一个更大的宽度(都32bppArgb)的小位图。
这是我的代码
private static unsafe void Draw(Bitmap bmp, Bitmap bmp2, int xPoint, int yPoint)
{
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, bmp.PixelFormat);
BitmapData bmData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp2.PixelFormat);
IntPtr scan0 = bmData.Scan0;
IntPtr scan02 = bmData2.Scan0;
int stride = bmData.Stride;
int stride2 = bmData2.Stride;
int nWidth = bmp2.Width;
int nHeight = bmp2.Height;
int sourceX = 0;
int sourceY = 0;
byte* p = (byte*)scan0.ToPointer();
p += yPoint * stride + xPoint * 4;
byte* p2 = (byte*)scan02.ToPointer();
p2 += sourceY * stride2 + sourceX * 4;
int bytes = nWidth * 4;
for (int y = 0; y < nHeight; y++)
{
for (int x = 0; x <nWidth; x++)
{
p[0] = p2[0];
p[1] = p2[1];
p[2] = p2[2];
p[3] = p2[3];
}
p += 4;
p2 += 4;
}
bmp.UnlockBits(bmData);
bmp2.UnlockBits(bmData2);
}
这是更新的代码
你把它拷贝到自身。对于'b2',你应该使用'scan02'而不是'scan0'。您还应该为'b2'使用'stride2'。然后你应该使用'stride'和'stride2'将'b'和'b2'移到下一行,而不是假设下一行在当前之后立即开始。线条之间可以填充,当图像在内存中倒置时,步幅甚至可以为负值。 – Guffa
@Guffa ohh ..没有看到它......谢谢你! – Slashy
@Guffa等待..现在我在这里得到一个异常'p [0] = p2 [0]; **试图读取或写入受保护的内存** – Slashy