2016-10-03 11 views
-1

У меня есть программа для объединения графических файлов в значок. Размеры включают 16,24,32,48,256 32bit. Они используют PNG и работают. У меня есть правильный список заголовков и каталогов/индексов.Сохранение BMP в файле значков

Однако, для 8 бит я использую BMP с четырьмя четырьмя байтами заголовка BMP. Эта часть файла значка не работает. Посмотрев значок MS, они снова сохранили BMP с удаленным заголовком из 14 байтов. Глядя на их данные BMP, у них есть второй заголовок, как я, но для 16x16 второй заголовок (BITMAPINFOHEADER) говорит 16x32. Швы BMP имеют ширину в два раза. Зачем? Является ли изображение в два раза шириной с битовой маской или чем-то еще?

Вот мой код (Примечание: изображение 32х32 растровый 32bit, когда пройдено.)

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 бит глубины цвета конкретным следовать формат : изображение кодируются как единое изображение, состоящее из цветных маски (далее «исключающая ИЛИ» маски) вместе с маской непрозрачности (далее «и маской») [..]

Каких результатов в:

[..] маски должны быть каждый из тех же размеров, а высота , указанная в заголовке BMP должны быть точно в два раза выше указан в структуре ICONDIRENTRY

Посмотрите здесь: https://en.wikipedia.org/wiki/ICO_(file_format)

+0

Спасибо. Я не думаю, что вы знаете, как добавить маску XOR в объект Bitmap, не так ли? Это 1bpp, где, как изображение, оно само является 8bpp. – James

+0

Все отсортировано сейчас! Уф! – James

+0

Я сделал: Собственный заголовок DIB с двойной высотой, добавьте палитру растровых изображений и массив цветов, а затем маску, которая в основном составляет 1 бит на пиксельные необработанные данные (дополненные), как описано на веб-странице. – James