COM インターフェイスを提供する電子ソフトウェア OMICRON MPD および MI を使用しています。COM インターフェイスが提供するメソッドを使用してスクリーンショットを撮り、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 インターフェイスのドキュメントによると、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: Creation a Bitmap From Scratch」というビデオを見て、取得したデータからイメージを構築するのに役立ちました。
バイト単位の画像データ、40 バイトの DIB ヘッダー、および最初の 27 バイトのデータを含むデータを受信していました (それが何であるかはわかりませんでした)。これを画像に変換するには、最初に 14 バイトのファイル ヘッダーが必要でした。これを次のように手動で作成しました。
byte[] fileHeader = { 0x42, 0x4d, 0x0c, 0xef, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00 };
16 進数のファイル サイズ (0x0c、0xef、0x82、847760 バイトのファイル サイズに相当する 0x00) がハード コードされていることに注意してください (バイトは簡単に動的にすることができます)。0x36 は、16 進数で 36 であるインデックス 54 にある実際の画像データが始まる場所です。
次に、DIB ヘッダーの開始位置 (私の場合はインデックス 27) にオフセットして、元の配列からそのデータを追加しました。
以下は、最初の 27 バイトの不明なデータと、インデックス 27 から始まる DIB ヘッダーを含む生データのスクリーンショットです。
上記は、最終的な画像の 16 進データのスクリーンショットです。青が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());