0

我想读取 ICO 文件并将每个图标保存到单独的 BMP 中。我的代码完成了 ICO 文件中第一个图标的技巧。但后来我不知道在哪里设置文件光标(在哪里 fseek 到)。

这是我用伪代码执行的步骤:

  1. 读取 ICONDIR = 读取前 6 个字节:
    • UInt16 为“保留”(始终为 0)
    • Uint16 作为“类型”(ICO 为 1,CUR 为 0)
    • Uint16 作为“计数”(图标数)
  2. 读取 ICONDIRENTRY = 接下来的 16 个字节
    • Uint8 作为“宽度”
    • Uint8 作为“高度”
    • Uint8 作为“颜色”
    • Uint16 作为“彩色平面”
    • Uint16 作为“每像素位数”
    • Uint32 作为“图像大小”
    • Uint32 作为“偏移量”
  3. 将文件位置设置为“偏移量”。读取 BITMAPINFOHEADER = 下一个 40 字节
    • Uint32 作为“标题大小”
    • Uint32 作为 'width2'
    • Uint32 作为'height2'
    • Uint16 作为“颜色平面 2”
    • Uint16 作为“每像素位数2”
    • Uint32 作为“压缩”
    • Uint32 作为“图像长度”
    • Uint32 作为 'dpi X'
    • Uint32 作为 'dpi Y'
    • Uint32 作为“使用的颜色”
    • Uint32 作为“重要颜色”
  4. 读取图像的像素,从 offset = 40 + 'offset' 我读取 'width' * 'height' * 'bits per pixel' / 8 bytes。我从 ICO 文件中获得了第一个图标。到目前为止,一切都很好。

但是我现在去哪里寻找呢?我尝试从我完成的地方阅读,但没有运气。我知道下一个图标的大小是 48x48 字节,所以我想我应该阅读下一个 ICONDIRENTRY,它应该给我 'width' 和 'height' = 48。但我不知道从哪里开始阅读。

我正在用 PHP 编写程序,但是对于此类问题的 PHP 人员通常会说“使用库 X”或“使用 ImageMagick”,我只需要知道算法即可。这样的程序通常是用 C++ 编写的,所以我标记了这个 C++。

ICO 文件中的下一个 ICONDIRENTRY 在哪里(什么偏移量)?

4

1 回答 1

1

你快到了...

ICO 格式以 ICONDIR、一个短标题和一个或多个 ICONDIRENTRY 块开始,这些块定义文件中每个图标的参数。要读取整个文件,首先要读取 ICONDIR 并将 ICONDIRENTRY 块解析为数组。

然后使用每个条目中的偏移量循环遍历您的数组以查找下一个图像。

文件格式在MSDN上有描述,在Wikipedia上也有一篇文章

于 2015-02-27T00:41:24.970 回答