我使用此代码将数据从bmp复制到c#中的结构数组, 当运行progrom显示消息“参数无效”
struct pix //structure for pixel in bmp image
{
public byte b;//Red
public byte g;//Green
public byte r;//Blue
};
private void button1_Click(object sender, EventArgs e)
{
byte[] bmp = File.ReadAllBytes("D:\\x.bmp");
Bitmap img = new Bitmap(openFileDialog1.FileName);
pix[,] bmpdata = new pix[img.Height-1, img.Width-1];
Array.Copy(bmp, 54, bmpdata, 0, (bmp.Length)-54);
}
程序有什么问题,是否有其他复制方法,我需要在图片框中显示新数组?
答案 0 :(得分:0)
抱歉,你不能那样使用Array.Copy
。
您的源数组是byte[]
,目标数组是pix[,]
。根据文档(Array.Copy
Method (Array
, Int32
, Array
, Int32
, Int32
)),数组维度必须相同。
sourceArray
和destinationArray
参数的维度必须相同。
但即使如此,你也无法使用Array.Copy
,因为你真正要做的是将byte[]
中的每3个连续项合并到pix[,]
内的一个项目中。不幸的是,无法使用Array.Copy
。
答案 1 :(得分:0)
我可以想出几种方法可以获得你想要的像素信息数组 最明显的是像
Bitmap img = new Bitmap(openFileDialog1.FileName);
pix[,] bmpdata = new pix[img.Height-1, img.Width-1];
for (x=0;x<img.Width;x++)
for (y=0;y<img.Height;y++)
{
Color c=img.GetPixel(x,y);
pix[x,y].b=c.B;
pix[x,y].r=c.R;
pix[x,y].g=c.G;
}
但是你没有告诉我们为什么你想要这种形式的位图。所以我不能评论这段代码的合适程度。你有什么理由不能保留Bitmap并根据需要调用GetPixel吗?
我不知道您打算拆分的图像有多大或者您需要什么样的性能,但我可以想象嵌套的循环在大图像上不会很快。
您可以探索的替代方法(如果需要)将直接从流中读取数据到您需要的格式。但是,这需要您了解.bmp的文件格式。