我想读取 ICO 文件并将每个图标保存到单独的 BMP 中。我的代码完成了 ICO 文件中第一个图标的技巧。但后来我不知道在哪里设置文件光标(在哪里 fseek 到)。
这是我用伪代码执行的步骤:
- 读取 ICONDIR = 读取前 6 个字节:
- UInt16 为“保留”(始终为 0)
- Uint16 作为“类型”(ICO 为 1,CUR 为 0)
- Uint16 作为“计数”(图标数)
- 读取 ICONDIRENTRY = 接下来的 16 个字节
- Uint8 作为“宽度”
- Uint8 作为“高度”
- Uint8 作为“颜色”
- Uint16 作为“彩色平面”
- Uint16 作为“每像素位数”
- Uint32 作为“图像大小”
- Uint32 作为“偏移量”
- 将文件位置设置为“偏移量”。读取 BITMAPINFOHEADER = 下一个 40 字节
- Uint32 作为“标题大小”
- Uint32 作为 'width2'
- Uint32 作为'height2'
- Uint16 作为“颜色平面 2”
- Uint16 作为“每像素位数2”
- Uint32 作为“压缩”
- Uint32 作为“图像长度”
- Uint32 作为 'dpi X'
- Uint32 作为 'dpi Y'
- Uint32 作为“使用的颜色”
- Uint32 作为“重要颜色”
- 读取图像的像素,从 offset = 40 + 'offset' 我读取 'width' * 'height' * 'bits per pixel' / 8 bytes。我从 ICO 文件中获得了第一个图标。到目前为止,一切都很好。
但是我现在去哪里寻找呢?我尝试从我完成的地方阅读,但没有运气。我知道下一个图标的大小是 48x48 字节,所以我想我应该阅读下一个 ICONDIRENTRY,它应该给我 'width' 和 'height' = 48。但我不知道从哪里开始阅读。
我正在用 PHP 编写程序,但是对于此类问题的 PHP 人员通常会说“使用库 X”或“使用 ImageMagick”,我只需要知道算法即可。这样的程序通常是用 C++ 编写的,所以我标记了这个 C++。
ICO 文件中的下一个 ICONDIRENTRY 在哪里(什么偏移量)?