Я пытаюсь реализовать метод обрезки самостоятельно, используя небезопасный код и указатель для ускорения всего процесса.C# cut area from image
Это мой код:
private unsafe void Cut(Bitmap bmp, Rectangle r) {
Bitmap result = new Bitmap(r.Width, r.Height, bmp.PixelFormat);
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
BitmapData bmData2 = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, result.PixelFormat);
IntPtr scan0 = bmData.Scan0;
IntPtr scan02 = bmData2.Scan0;
int stride = bmData.Stride;
int stride2 = bmData2.Stride;
int x = r.X;
int y = r.Y;
int width = r.Width;
int height = r.Height;
for (; y < height; y++) {
byte * p = (byte *) scan0.ToPointer();
p += y * stride;
byte * p2 = (byte *) scan02.ToPointer();
p2 += y * stride2;
for (; x < width; x++) {
p2[0] = p[0];
p2[1] = p[1];
p2[2] = p[2];
p2[3]=p[3];
p += 4;
p2 += 4;
}
}
result.Save("a.png");
}
И вызов этого метода:
Bitmap b = (Bitmap)Bitmap.FromFile(@"C:\Users\itapi\Desktop\1.png");
Rectangle r = new Rectangle(200, 500, 300, 450);
Cut(b, r);
Когда я запускаю код, я просто получить черный прямоугольник в качестве результата. ... не те пиксели, которые я хотел скопировать из внутреннего изображения.
Изображение из приведенного выше примера в формате 32bpprgb
Я не уверен, что я делаю wrong..i'll признателен за любую помощь.
Спасибо.
вы указывали на Somthing right..but он не решил проблему :) пока нет. я вижу такое же черное изображение. – Slashy
для (; y <высота; y ++) завершает мгновенно .... – CharlesW
Обратите внимание, что я сделал как можно меньше изменений для вашего кода. Я не переписал его для вас, просто сделал его работу для Y, он посеял X в неправильном месте, но вы можете понять это ... – CharlesW