我正在尝试自己实现一个裁剪方法,使用不安全的代码和指针来加速整个过程。
这是我的代码:
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
格式
我不确定我做错了什么..我会感激任何帮助。
感谢。
答案 0 :(得分:0)
在结果上,您选择了&#34; System.Drawing.Imaging.ImageLockMode.ReadOnly&#34;我想你想要ReadWrite或WriteOnly。
当我运行调试器时,这句话:for(; y&lt; height; y ++)条件在我相当大的图像上立即失败。所以你的循环逻辑在行中运行是不正确的......使用调试器:)
编辑我通过调试器运行它,你的Y和X逻辑是错误的。我对Y逻辑进行了快速修复,让它太过裁剪了。您必须执行与X类似的操作才能获得正确的裁剪点。 试试这个,它会被裁剪并保存一个文件:
int x = r.X;
int y = r.Y;
int width = r.Width;
int height = r.Height;
int newY = 0;
for (y = r.Y; y < height+r.Y; y++) //For each line in the old image
{
byte* p = (byte*)scan0.ToPointer();
p += y * stride;
byte* p2 = (byte*)scan02.ToPointer();
p2 += newY * stride2;
for (x=r.X; x < width+r.X; x++)
{
p2[0] = p[0];
p2[1] = p[1];
p2[2] = p[2];
p2[3] = p[3];
p += 4;
p2 += 4;
}
newY++;
}
result.Save("\\a.png");