在C#中剪切图像数据

时间:2012-12-13 08:23:57

标签: c# image-processing

可能会删除图像数据。 如果我知道:

byte[] ImageData;
int width;
int height;

基本上我尝试找到如何从byte[]来源获取图像的内部部分。

例如我有w:1000px和h:600px的图像。我希望在byte[]byte[]中间部分200 * 200px。

2 个答案:

答案 0 :(得分:2)

首先,您需要知道数组中有多少字节代表一个像素。以下假设您有一个每像素3个字节的RGB图像。

然后,表示剪切块左上角的第一个字节的数组索引表示为

int i = y * w + x

其中yy - 剪裁的坐标,w是整个图片的宽度,xx的坐标。切口。

然后,您可以执行以下操作:

// cw: The width of the cutout
// ch: The height of the cutout
// x1/y1: Top-left corner coordinates

byte[] cutout = new byte[cw * ch * 3]; // Byte array that takes the cutout bytes
for (int cy = y1; cy < y2; cy++)
{
    int i = cy * w + x1;
    int dest = (cy - y1) * cw * 3;
    Array.Copy(imagebytes, i, cutout, dest, cw * 3);
}

这将从第一行迭代到最后一行。然后,在i中,它计算应该剪切的图像中行的第一个字节的索引。在dest中,它计算应复制字节的cutout中的索引。

之后,它会将当前行的字节复制到指定位置的cutout

我还没有测试过这段代码,但是这样的东西应该可行。此外,请注意,目前没有范围检查 - 您需要确保切口的位置和尺寸确实在图像的范围内。

答案 1 :(得分:0)

如果您可以先将其转换为图片,则可以使用我在Bytes.Com

上找到的代码
  

以下代码适用于我。它加载.gif,绘制30 x 30   将gif的一部分放入一个屏幕外的位图,然后绘制缩放   图像进入图片框。

System.Drawing.Image img=... create the image from the bye array ....
Graphics g1 = pictureBox1.CreateGraphics();
g1.DrawImage(img, 0, 0, img.Width, img.Height);
g1.Dispose();

Graphics g3 = Graphics.FromImage(bmp);
g3.DrawImageUnscaled(img, 0, 0, bmp.Width, bmp.Height);

Graphics g2 = pictureBox2.CreateGraphics();
g2.DrawImageUnscaled(bmp, 0, 0, bmp.Width, bmp.Height);
g2.Dispose();

g3.Dispose();
img.Dispose();

您可以使用此问题将字节[]转换为图像:Convert a Byte array to Image in c# after modifying the array