0

我在 windows xp 下创建图标时遇到问题。这是我的代码:

void SaveAsIcon(Bitmap SourceBitmap, string FilePath)
{

            FileStream FS = new FileStream(FilePath, FileMode.Create);
            // ICO header
            FS.WriteByte(0); FS.WriteByte(0);
            FS.WriteByte(1); FS.WriteByte(0);
            FS.WriteByte(1); FS.WriteByte(0);

            // Image size
            FS.WriteByte((byte)SourceBitmap.Width);
            FS.WriteByte((byte)SourceBitmap.Height);
            // Palette
            FS.WriteByte(0);
            // Reserved
            FS.WriteByte(0);
            // Number of color planes
            FS.WriteByte(0); FS.WriteByte(0);
            // Bits per pixel
            FS.WriteByte(32); FS.WriteByte(0);

            // Data size, will be written after the data
            FS.WriteByte(0);
            FS.WriteByte(0);
            FS.WriteByte(0);
            FS.WriteByte(0);

            // Offset to image data, fixed at 22
            FS.WriteByte(22);
            FS.WriteByte(0);
            FS.WriteByte(0);
            FS.WriteByte(0);

            // Writing actual data
            SourceBitmap.Save(FS, ImageFormat.Png);

            // Getting data length (file length minus header)
            long Len = FS.Length - 22;

            // Write it in the correct place
            FS.Seek(14, SeekOrigin.Begin);
            FS.WriteByte((byte)Len);
            FS.WriteByte((byte)(Len >> 8));

            FS.Close();
}

它在 vista 及更高版本下工作正常。

我不知道在 windows xp 下从位图创建图标的方法中应该改变什么。

当我尝试使用上述方法的图标时,我收到此错误:

生成 Win32 资源时出错:读取图标时出错

在 vista 下,7 和 8 可以正常工作。

4

1 回答 1

1
  SourceBitmap.Save(FS, ImageFormat.Png);

XP 不支持 PNG 格式的图标,该功能直到 Vista 才添加。

如果 XP 支持很重要,您将需要回退到 BMP 格式。请注意,仅更改 ImageFormat 是不够的,您需要确保像素格式与您在标题中写入的内容相匹配,并且您不应该写入 BITMAPFILEHEADER。换句话说,跳过 Save() 方法写入的前 14 个字节。

于 2013-07-20T12:51:50.013 回答