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