可能会删除图像数据。 如果我知道:
byte[] ImageData;
int width;
int height;
基本上我尝试找到如何从byte[]
来源获取图像的内部部分。
例如我有w:1000px和h:600px的图像。我希望在byte[]
中byte[]
中间部分200 * 200px。
答案 0 :(得分:2)
首先,您需要知道数组中有多少字节代表一个像素。以下假设您有一个每像素3个字节的RGB图像。
然后,表示剪切块左上角的第一个字节的数组索引表示为
int i = y * w + x
其中y
是y
- 剪裁的坐标,w
是整个图片的宽度,x
是x
的坐标。切口。
然后,您可以执行以下操作:
// 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