在图标文件中存储 BMP

Storing BMP in icon file

我有一个程序可以将图形文件合并到一个图标中。大小包括 16、24、32、48、256 32 位。这些使用 PNG 和作品。我有正确的 header 和 directory/index 记录列表。

然而,对于 8 位,我使用 BMP,其中 header 的前 14 个字节被剥离。这部分图标文件不起作用。查看 MS 图标后,他们再次存储了 BMP,并删除了 14 字节 header。查看他们的 BMP 数据,他们有第二个 header 和我一样,但对于 16x16,第二个 header (BITMAPINFOHEADER) 表示 16x32。 BMP 接缝宽度的两倍。为什么?图像宽度的两倍是否带有位掩码或其他东西?

这是我的代码:(注意图像在传递时是 32x32 位图 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));
    }
}

是的,你是对的:

Images with less than 32 bits of color depth follow a particular format: the image is encoded as a single image consisting of a color mask (the "XOR mask") together with an opacity mask (the "AND mask")[..]

结果是:

[..] the masks must each be of the same dimensions, and the height specified in the BMP header must be exactly twice the height specified in the ICONDIRENTRY structure

看这里:https://en.wikipedia.org/wiki/ICO_(file_format)