2

イメージ(ビットマップ)をバイト配列に変換する次のコードがあります。

public byte[] ConvertImageToByteArray(Image imageToConvert, ImageFormat formatOfImage)
{
    byte[] Ret;
    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            imageToConvert.Save(ms, formatOfImage);
            Ret = ms.ToArray();
        }
    }
    catch (Exception) 
    { 
        throw;
    }

    return Ret;
}

およびバイト配列をイメージ (ビットマップ) に変換します。

public Bitmap ConvertByteArrayToImage(byte[] myByteArray)
{
    Image newImage;

    using (MemoryStream ms = new MemoryStream(myByteArray, 0, myByteArray.Length))
    {
        ms.Write(myByteArray, 0, myByteArray.Length);
        newImage = Image.FromStream(ms, true);
    }
    return newImage;
 }

これが私のメインプログラムです:

    byte[] test = ConvertImageToByteArray(Image.FromFile("oldImage.bmp"), ImageFormat.Bmp);

    Bitmap bmp = ConvertByteArrayToImage(test);
    bmp.Save("newImage.bmp");

しかし、両方の画像ファイル (古いビットマップ画像と新しいビットマップ画像) を比較すると、チェックサムが異なっているように見えました。それが起こる理由はありますか?整合性を維持するために修正する方法は?

4

2 に答える 2

2

基本的に、同一の画像を BMP ファイルにエンコードする方法は多数あります。私が見つけたランダムな画像であなたの例を試してみると、.NETクラスが BMP ヘッダーの構造体のフィールドBitmapを埋めずにファイルを保存することがわかります (ただし、IrfanView によって生成された元の画像はそれを埋めています)。これは完全に正しいですおよび文書化された可能性。(「これは、BI_RGB ビットマップに対してゼロに設定される場合があります。」)biSizeImageBITMAPINFOHEADER

BMP 形式の変数はこれだけではありません。たとえば、ヘッダーで指定された、画像内のピクセル データの可能な順序 (上から下、下から上) が複数あります。(「biHeight が正の場合、ビットマップはボトムアップ DIB であり、その原点は左下隅です。biHeight が負の場合、ビットマップはトップダウン DIB であり、その原点は左上隅です。」)

そのため、自分の管理下にないソースから BMP ファイルを受け取り、まったく同じ BMP バリアントを使用してイメージを作成する必要がある場合、やらなければならない作業が多く、標準の .NET を使用できるとは思えません。そのためのヘルパー クラス。

この質問も参照してください:ビットマップをファイルに保存すると、画像サイズ フィールドにゼロが含まれます

于 2012-10-25T09:33:50.680 に答える
1

少しおしゃべりした後、解決策はバイトの読み取りと書き込みに行き着き、画像オブジェクトを方程式から取り出して、生のバイトを処理するだけです。

ファイルを読み取るには:

    MemoryStream ms = new MemoryStream(File.ReadAllBytes("filename"));

ファイルを書き込むには:

    File.WriteAllBytes("outputfile", ms.ToArray());
于 2012-10-25T09:54:28.837 に答える