2016-10-03 4 views
-1

アイコンにグラフィックファイルを結合するプログラムがあります。サイズには16,24,32,48,256 32bitが含まれます。これらはPNGを使用して動作します。私は正しいヘッダとディレクトリ/インデックスレコードリストを持っています。アイコンファイルにBMPを保存する

しかし、私は8ビットのためにBMPのヘッダの最初の14バイトを取り除いてBMPを使用しています。アイコンファイルのこの部分は機能しません。 MSアイコンを見ると、BMPは14バイトのヘッダを取り除いた状態で再び格納されています。彼らのBMPデータを見ると、私のように2番目のヘッダーがありますが、16x16では2番目のヘッダー(BITMAPINFOHEADER)は16x32と言います。 BMPの継ぎ目は、幅の2倍になります。どうして?ビットマスクなどでイメージの幅が2倍になっていますか?ここで

は私のコードです:(。渡されたときに注意画像は32×32ビットマップの32ビットである)

using (Bitmap imageAsBitmap = new Bitmap(image)) 
{ 
    int colorCount = 0; 
    using (Bitmap bitmap = imageAsBitmap.ColourReduction256(out colorCount)) 
    { 
     byte[] imageBytes = new byte[] { }; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
      imageBytes = ms.ToArray(); 
     } 
     byte[] data = new byte[] { }; 
     Array.Resize(ref data, imageBytes.Length - 14); 
     Array.Copy(imageBytes, 14, data, 0, data.Length); 
     enteries.Add(new IconEntry(data, image.Width, image.Height, 8)); 
    } 
} 
+0

「Array.Resize」は不要です。データを 'new byte [imageBytes.Length - 14]'として宣言することができます。 – Abion47

+0

@ Abion47大きさは分からないが、この場合は大量の通信を行っているので、ちょっと習慣を試してみてください。私はそれをより読みやすくするためにその部分を修正するかもしれません。ありがとう。 – James

答えて

1

はい、あなたは正しいです:色深度の32ビット未満で

画像は、特定に従ってください 形式:画像は、 マスク(「XORマスク」)と不透明マスク(「ANDマスク」)[..]の1つの画像としてエンコードされます。[..]

何結果:

[..]マスクはそれぞれ同じ大きさでなければならず、そしてBMPヘッダで指定された高さ はちょうど2倍の高さはICONDIRENTRY構造

で を指定する必要があります

ここをクリックしてください:​​

+0

ありがとうございます。私はXORマスクをBitmapオブジェクトに追加する方法を教えてくれませんか?それは1bppです。画像は自己が8bppです。 – James

+0

今すぐソート!ピー! – James

+0

私はそうしました:ダブルハイトの独自のDIBヘッダーは、ビットマップパレットとカラー配列を追加し、その後、基本的に1ビット/ピクセルの生データ(パッディング)でWebページ上のcalcとしてマスクされます。 – James

関連する問題