我試圖做一種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