Im пытается сделать вид Grahpics.DrawImage
реализация с использованием небезопасный код и указатели конечно.C# Draw image implementation
В этом случае я пытаюсь нарисовать небольшое растровое изображение на большей ширине (оба 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'. Вы также должны использовать 'stride2' для' b2'. Затем вы должны использовать 'stride' и' stride2', чтобы переместить 'b' и' b2' в следующую строку, а не предполагать, что следующая строка начинается сразу после текущей. Между линиями может быть отступы, а шаг может быть отрицательным, если изображение хранится перевернуто в памяти. – Guffa
@ Guffa ohh .. не видел ... спасибо мужчине! – Slashy
@Guffa wait .. теперь я получаю исключение здесь 'p [0] = p2 [0]; ** попытался прочитать или записать защищенную память ** – Slashy