【问题标题】:Storing BMP in icon file将 BMP 存储在图标文件中
【发布时间】:2016-10-03 10:22:30
【问题描述】:

我有一个程序可以将图形文件合并到一个图标中。尺寸包括 16,24,32,48,256 32bit。这些使用PNG并且可以工作。我有正确的标题和目录/索引记录列表。

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

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

【问题讨论】:

  • Array.Resize 似乎没有必要。您可以将数据声明为new byte[imageBytes.Length - 14]
  • @Abion47 尝试一下这是一种习惯,因为我做了很多不知道大小的通信,但在这种情况下是的。我可能会修改那部分以使其更具可读性。谢谢。

标签: c# icons file-format


【解决方案1】:

是的,你是对的:

颜色深度小于 32 位的图像遵循特定的 格式:图像被编码为由颜色组成的单个图像 掩码(“XOR 掩码”)和不透明掩码(“AND 掩码”)[..]

结果:

[..] 每个掩码必须具有相同的尺寸,并且高度 BMP 标头中指定的高度必须恰好是指定高度的两倍 在 ICONDIRENTRY 结构中

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

【讨论】:

  • 谢谢。我不认为您知道如何将 XOR 掩码添加到 Bitmap 对象,对吗?它是 1bpp,而它自己的图像是 8bpp。
  • 现在全部排序!呸!
  • 我做了:拥有双倍高度的 DIB 标头,添加位图调色板和颜色数组,然后按照网页上的计算基本上是每像素 1 位原始数据(填充)的掩码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多