代码之家  ›  专栏  ›  技术社区  ›  Tom

将ICO转换为BMP

  •  1
  • Tom  · 技术社区  · 9 年前

    我想读取ICO文件并将每个图标保存到单独的BMP中。 我的代码对ICO文件中的第一个图标起作用。但是,我不知道在哪里设置文件光标(fseek的位置)。

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

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

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

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

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

    1 回复  |  直到 9 年前
        1
  •  1
  •   user1864610 user1864610    9 年前

    你快到了。。。

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

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

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