我有一个将图形文件组合在一个图标中的程序。尺寸包括16,24,32,48,256 32bit。这些使用PNG并且有效。我有正确的标题和目录/索引记录列表。
然而,对于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 :(得分:1)
是的,你是对的:
颜色深度小于32位的图像遵循特定的颜色 格式:图像被编码为由颜色组成的单个图像 掩码(“XOR掩码”)和不透明掩码(“AND掩码”)[..]
结果如下:
[..]面具必须各自具有相同的尺寸和高度 BMP头中指定的值必须是指定高度的两倍 在ICONDIRENTRY结构中