将ICO转换为BMP

时间:2015-02-27 00:25:33

标签: c++ bmp ico

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

以下是我在伪代码中执行的步骤:

  1. 读取ICONDIR =读取前6个字节:
    • UInt16为'reserved'(始终为0)
    • Uint16为'type'(ICO为1,CUR为0)
    • Uint16为'count'(图标数量)
  2. 读取ICONDIRENTRY =接下来的16个字节
    • Uint8为'width'
    • Uint8为'height'
    • Uint8为'colors'
    • Uint16为'color planes'
    • Uint16为'每像素位数'
    • Uint32为'图像尺寸'
    • Uint32为'offset'
  3. 将文件位置设置为'offset'。 读BITMAPINFOHEADER =接下来的40个字节
    • Uint32为'标题大小'
    • Uint32为'width2'
    • Uint32为'height2'
    • Uint16为'color planes2'
    • Uint16为'bits per pixel2'
    • Uint32为'压缩'
    • Uint32为'图像长度'
    • Uint32为'dpi X'
    • Uint32为'dpi Y'
    • Uint32为'使用的颜色'
    • Uint32为'重要颜色'
  4. 读取图像的像素,从offset = 40 +'offset'读取'width'*'height'*'每像素位数'/ 8字节。 我从ICO文件中获得了第一个图标。到现在为止还挺好。
  5. 但是我现在要去哪里?我试着从我完成的地方读书,但没有运气。 我知道下一个图标的大小是48x48字节,所以我想我应该阅读下一个ICONDIRENTRY,它应该给我'width'和'height'= 48.但我不知道从哪里开始阅读。

    我正在用PHP编写程序,但是像这样的问题的PHP人员通常说'使用库X'或'使用ImageMagick'而我只需要知道算法。这些程序通常用C ++编写,所以我标记了这个C ++。

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

1 个答案:

答案 0 :(得分:1)

你差不多......

ICO格式以ICONDIR开头,一个短标题和一个或多个ICONDIRENTRY块,用于定义文件中每个图标的参数。要读取整个文件,请先阅读ICONDIR并将ICONDIRENTRY块解析为数组。

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

文件格式在MSDN上有描述,还有一篇关于Wikipedia

的文章