3

生のビットマップ データのみを取得する必要があります (ヘッダーやその他の情報はありません)。次のコードを使用して、ビットマップ データを取得しました。

using (Bitmap bitmap = svgDocument.Draw())
{
  Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
  BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat);
  var length = Math.Abs(bitmapData.Stride) * bitmapData.Height;

  byte[] bytes = new byte[length];
  Marshal.Copy(bitmapData.Scan0, bytes, 0, length);
  bitmap.UnlockBits(bitmapData);

  MemoryStream memoryStream = new MemoryStream();
  string filename = DateTime.Now.Ticks.ToString() + ".bmp"; // this works fine
  bitmap.Save(filename, ImageFormat.Bmp);

  string base64 = Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks); // the base64 is reversed. 
}

ビットマップを保存すると、すべて問題なく表示されます。画像は反転していません。ただし、データを Base64 に変換するためだけにバイトを使用すると、画像が反転します。

編集1:

これは Base64 変換とは何の関係もないと思います。バイト順が逆になっているようです。

コードを使用して画像を保存すると、画像は次のようになります。

ここに画像の説明を入力

バイトを使用すると、次のように表示されます。

ここに画像の説明を入力

解決:

解決策を見つけました。新しいビットマップを作成する代わりに、ヘッダー情報の最初の 54 バイトをスキップして、バイト配列を格納しました。

MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Bmp);

// Skip header
IEnumerable<byte> bytes = memoryStream.ToArray().Skip(54);
4

3 に答える 3

0

解決策を見つけました。新しいビットマップを作成する代わりに、ヘッダー情報の最初の 54 バイトをスキップして、バイト配列を格納しました。

MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Bmp);

// Skip header
IEnumerable<byte> bytes = memoryStream.ToArray().Skip(54);
于 2014-11-10T19:03:53.570 に答える
0

標準の BMP 形式では、イメージのバイトを古典的な上/下の順序または逆の順序で格納できます。

画像がこの方法で保存されているかどうかを確認する方法はHeight、BMP ヘッダーのパラメーターの値を確認することです。

  • の場合Height < 0、画像の高さはabs(Height)で、ピクセルは逆 (下/上) の順序で格納されます。

  • の場合Height > 0は、ピクセルが上から下に「通常の」順序になっている、予想どおりのケースです。

あなたの場合、ネガティブHeightヘッダーで保存された画像から始めているということです(SVGオブジェクトは何らかの理由でそうしなければなりません)。ただし、チェックしないので、ピクセルを下から上に格納します。

オブジェクトと一緒に保存するとBMP、コンテキストからそれが理解されます。しかし、ピクセルだけをエクスポートすると、画像をロードするサードパーティのアプリケーションはポジティブHeightに見えるため、画像が上下逆さまに表示されます。

このピクセルの順序の詳細については、Wikipedia の BMP ファイル形式のページを参照してください。

編集:

したがって、BMP ファイルをディスクに書き込むときは、次のことを行う必要があります。

  1. バイトが上から下の順序 (a) または下から上の順序 (b) であるかどうかを確認します。

  2. (a) の場合:height画像の を BMP ヘッダーに正の値として入れます。

  3. (b) の場合: - heightBMP ヘッダーに負の値を入れます。画像を表示するサードパーティ プログラムが、画像が反転していることを認識できるようにします。

于 2013-03-31T05:23:33.487 に答える