2016-10-03 49 views
-1

我有一個程序將圖形文件合併到一個圖標中。尺寸包括16,24,32,48,256 32位。這些使用PNG和工作。我有正確的標題和目錄/索引記錄列表。在圖標文件中存儲BMP

但是,對於8位,我正在使用BMP和BMP的頭部的前14個字節被剝離。這部分圖標文件不起作用。看了一個MS圖標後,他們再次刪除了BMP,並刪除了14個字節的標題。看看他們的BMP數據,他們有我的第二個頭,但對於16x16第二個頭(BITMAPINFOHEADER)說16x32。 BMP接縫的寬度是其兩倍。爲什麼?圖像的寬度是一個位掩碼的兩倍嗎?

這裏是我的代碼(注:圖片是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掩碼」)組成的單個圖像[..]

在什麼樣的結果:

[..]掩模每一個都必須具有相同的尺寸,並且在BMP頭中指定的高度 必須正好兩倍的高度在ICONDIRENTRY結構中指定

看看這裏:​​

+0

謝謝。我不想讓你知道如何將XOR掩碼添加到位圖對象嗎?這是1bpp,因爲它自己的圖像是8bpp。 – James

+0

全部整理!唷! – James

+0

我做了:擁有雙倍高度的DIB頭部,添加位圖調色板和顏色數組,然後根據網頁上的計算結果掩蓋基本上每像素1位的原始數據(填充)。 – James