可能会截取图像数据。如果我知道:
byte[] ImageData;
int width;
int height;
byte[]
基本上我尝试找到如何从源中获取图像的内部部分。
例如,我有 w: 1000px 和 h: 600px 的图像。我想要byte[]
中间部分 200*200px 在byte[]
.
可能会截取图像数据。如果我知道:
byte[] ImageData;
int width;
int height;
byte[]
基本上我尝试找到如何从源中获取图像的内部部分。
例如,我有 w: 1000px 和 h: 600px 的图像。我想要byte[]
中间部分 200*200px 在byte[]
.
首先,您需要知道数组中有多少字节代表一个像素。以下假设您有一个每像素 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
指定位置。
我还没有测试过这段代码,真的,但类似的东西应该可以工作。另外,请注意目前没有范围检查 - 您需要确保切口的位置和尺寸确实在图像的范围内。
如果您可以先将其转换为图像,则可以使用我在Bytes.Com上找到的这段代码
以下代码适用于我。它加载 .gif,将 gif 的 30 x 30 部分绘制到屏幕外位图中,然后将缩放后的图像绘制到图片框中。
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();
您可以使用此问题将您的 byte[] 转换为图像:Convert a Byte array to Image in c# after modifying the array