gpt4 book ai didi

c# - 设备独立位图字节数组到图像 : Parameter is not valid

转载 作者:行者123 更新时间:2023-11-30 21:38:45 28 4
gpt4 key购买 nike

我正在使用提供 COM 接口(interface)的电子软件 OMICRON MPD 和 MI。我正在通过 COM 接口(interface)提供的方法进行屏幕截图,并尝试将 byte[] 保存到图像文件中。

我的代码:

byte[] rawImg = ...
MemoryStream mstream = new MemoryStream(rawImg);
ImageConverter imageConverter = new System.Drawing.ImageConverter();
System.Drawing.Image image = imageConverter.ConvertFrom(rawImg) as System.Drawing.Image; //error line
image.Save(@"path\img.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

我得到错误:

System.ArgumentException' occurred in System.Drawing.dll Parameter is not valid

我检查了字节数组的长度:

rawImg.Length
//897832

我可以使用以下方法将上述内存流保存到文件中:

using (FileStream file = new FileStream(@"path\img.txt", FileMode.Create, FileAccess.Write))
{
mstream.WriteTo(file);
}

我不确定这是什么意思,但我该如何调试呢?错误在哪里?是我收到的数据有误,还是 C# 代码将其保存为图像。

根据 COM 接口(interface)文档,rawImg 是与设备无关的位图(格式与 .BMP 文件相同)。

失败的尝试 #1

ImageConverter imageConverter = new System.Drawing.ImageConverter();
Image image = imageConverter.ConvertFrom(rawImg) as Image; //error line
image.Save(@"path\img.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

给出与上面关于无效参数相同的错误

最终解决方案

我观看了一个名为“Hex To BMP:从头开始创建位图”的视频,它帮助我根据获得的数据构建图像。

我收到的数据包含以字节为单位的图像数据、40 字节的 DIB header 和一些初始的 27 字节数据(我无法真正弄清楚它是什么)。要将其转换为图像,开头需要一个 14 字节的文件头,这是我手动构建的,如下所示:

byte[] fileHeader = { 0x42, 0x4d, 0x0c, 0xef, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00 };

请注意,十六进制文件大小(0x0c、0xef、0x82、0x00 等于 847760 字节文件大小)是硬编码的(字节可以很容易地动态化)。 0x36 是实际图像数据开始的地方,索引 54 是十六进制的 36。

然后我只是通过偏移到 DIB header 开始的位置(在我的例子中是索引 27)来附加原始数组中的数据。

下面是我的原始数据的屏幕截图,其中包含初始 27 个字节的未知数据和从索引 27 开始的 DIB header 。

enter image description here

enter image description here

上面是我最终图像十六进制数据的截图。蓝色是14字节的文件头,红色是DIB头40字节,其余绿色开头的是图像数据。使用“.bmp”扩展名保存此数据,您将获得一张图像。

我的代码:

byte[] imgData, newImgData;
byte[] fileHeader = { 0x42, 0x4d, 0x0c, 0xef, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00 };
newImgData = new byte[847760];
BinaryFormatter bf = new BinaryFormatter();
string path2 = @"path\myImg.bmp";
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, value);
mgData = ms.ToArray();

}
for(int i = 0; i < fileHeader.Count(); i++)
{
newImgData[i] = fileHeader[i];
}

int indx = 14;

for (int i = 27; i < imgData.Count(); i++)
{
newImgData[indx] = imgData[i];
indx++;
}

System.IO.File.WriteAllBytes(path2, newImgData.ToArray());

最佳答案

查看 Notepad++ 转储,这似乎只是每像素 32 位或 4 字节 ARGB 图像的原始字节。您应该能够使用 Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr)构造函数并只传入原始字节。唯一的问题是确定图像的 widthheightstridePixelFormat,但您应该能够通过一些实验来解决这个问题。

这是一个示例,其中我制作了一个与您展示的类似的字节数组:

byte[] bytes = new byte[] {
0,64,128,128,
0,64,128,128,
0,64,128,128,
0,64,128,128,
0,64,128,128,
0,64,128,128,
0,64,128,128,
0,64,128,128,
};

unsafe
{
fixed (byte* pBytes = bytes)
{
int width = 4; // Your width
int height = 2; // Your height
int stride = width * 4; // Your stride
Bitmap bitmap = new Bitmap(width, height, stride, PixelFormat.Format32bppArgb, new IntPtr(pBytes));
bitmap.Save(@"c:\temp\bitmap.png"); // Could save to another format like .jpg
}
}

关于c# - 设备独立位图字节数组到图像 : Parameter is not valid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45696075/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com