2

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());
4

2 に答える 2