c#从图像中剪切区域

本文关键字:区域 图像 | 更新日期: 2023-09-27 17:54:38

我正在尝试实现一个裁剪方法自己,使用不安全的代码和指针来加快整个过程。

这是我的代码:

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格式我不知道我做错了什么。我很感激你的帮助。

谢谢。

c#从图像中剪切区域

在结果中,您选择了" system . drawing . image . imagelockmode "。ReadOnly"我认为你想要ReadWrite或WriteOnly。

当我运行调试器时,这个语句:for (;y & lt;高度;在我的相当大的图像上,y++)条件立即失败。所以你的循环逻辑是不正确的运行在行…使用调试器:)

EDIT我通过调试器运行它,你的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");