易语言如何实现提取ICO图标并支持多种图像格式转换功能

这篇文章主要介绍了易语言如何实现提取ICO图标并支持多种图像格式转换功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

DLL命令表

.版本 2
.DLL命令 拷贝内存_BITMAPINFOHEADER, 整数型, "kernel32", "RtlMoveMemory", , RtlMoveMemory
  .参数 目标数据地址, 字节集, 传址, lpvDest
  .参数 源数据, BITMAPINFOHEADER, 传址, lpvSource
  .参数 尺寸, 整数型, , 40cbCopy
.DLL命令 拷贝内存_ICONFILEHEADER, 整数型, "kernel32", "RtlMoveMemory", , RtlMoveMemory
  .参数 目标数据地址, 字节集, 传址, lpvDest
  .参数 源数据, ICONFILEHEADER, , lpvSource
  .参数 尺寸, 整数型, , 22cbCopy

自定义数据类型表

.版本 2
.数据类型 ICONFILEHEADER, , 文件头22
  .成员 idReserved, 短整数型, , , 为0
  .成员 idType, 短整数型, , , 为1图标,2为鼠标
  .成员 idCount, 短整数型, , , 文件中图标个数,为1
  .成员 bWidth, 字节型, , , 宽,为16或32
  .成员 bHeight, 字节型, , , 高,为16或32
  .成员 bColorCount, 字节型, , , 调色盘颜色数量:16或255 或0
  .成员 bReserved, 字节型, , , 为0
  .成员 wPlanes, 短整数型, , , idType为2,鼠标热点左边
  .成员 wBitCount, 短整数型, , , 每个像素占的位数 .idType为2,鼠标热点顶边
  .成员 dwBytesInRes, 整数型, , , 图标文件后四项总字节数
  .成员 dwImageOffset, 整数型, , , 图标文件头长度,为22
.数据类型 BITMAPINFOHEADER, , 信息头40
  .成员 biSize, 整数型, , , 信息头的长度,为40
  .成员 biWidth, 整数型, , , 宽
  .成员 biHeight, 整数型, , , 扫描两遍,值为实实际高度的2 倍
  .成员 iPlanes, 短整数型, , , 为1
  .成员 biBitCount, 短整数型, , , 每个像素占的位数
  .成员 biCompression, 整数型, , , 为0
  .成员 biSizeImage, 整数型, , , 图标文件后三项总字节数
  .成员 biXPelsPerMeter, 整数型, , , 为0
  .成员 biYPelsPerMeter, 整数型, , , 为0
  .成员 biClrUsed, 整数型, , , 为0
  .成员 biClrImportant, 整数型, , , 为0
.数据类型 RGBDATA, , 图像信息中每一个像素包含的RGB
  .成员 B, 字节型
  .成员 R, 字节型
  .成员 G, 字节型
.数据类型 图像大小
  .成员 宽度, 整数型
  .成员 高度, 整数型

提取ICO图标

.版本 2
.支持库 edroptarget
.支持库 iext2
.支持库 eAPI
.支持库 iext5
.支持库 shell
.支持库 eImgConverter
.支持库 BmpOperate
.程序集 窗口程序集1
.程序集变量 程序集_欲删除的图标, 文本型
.程序集变量 程序集_文件路径, 文本型
.程序集变量 程序集_图像大小, 图像大小
.子程序 __启动窗口_创建完毕
拖放对象1.注册拖放控件 (_启动窗口.取窗口句柄 ())
检测图像欲转换大小 ()
.子程序 _拖放对象1_得到文件
.参数 接收到的文件路径, 文本型
编辑框1.内容 = 接收到的文件路径
.子程序 _按钮_提取图标_被单击
.局部变量 i, 整数型
.局部变量 图标资源, 字节集
.局部变量 后缀名, 文本型
.局部变量 是否空图标, 字节集
.局部变量 画板的底图, 字节集
.如果真 (寻找文本 (程序集_文件路径, “.”, , 真) = -1)
  信息框 (“文件路径不正确,请尝试更换文件再试!”, #错误图标, )
  返回 ()
.如果真结束
.计次循环首 (取文件内图标数 (程序集_文件路径), i)
  提取资源文件图标 (程序集_文件路径, 0, 取运行目录 () + “\” + 到文本 (i) + “.ico”, i)
.计次循环尾 ()
.如果真 (取文件内图标数 (程序集_文件路径) ≠ 0)
  气球提示框1.弹出提示框 (取鼠标水平位置 (), 取鼠标垂直位置 (), “图标提取成功。”, -1, )
.如果真结束
程序集_欲删除的图标 = 编辑框1.内容
' -------上面代码提取平常的 EXE、DLL、ICL、ICO。图标 下面的是为了将图像转换成为BMP后在转换ICO图标----------
后缀名 = 到小写 (取文本右边 (程序集_文件路径, 4))
.如果真 (后缀名 ≠ “.exe” 且 后缀名 ≠ “.dll” 且 后缀名 ≠ “.icl” 且 后缀名 ≠ “.ico”)
  画板1.底图 = 读入文件 (编辑框1.内容)
  画板的底图 = 画板1.底图
  画板1.宽度 = 程序集_图像大小.宽度
  画板1.高度 = 程序集_图像大小.高度
  画板1.底图方式 = #缩放图片
  写到文件 (取特定目录 (11) + “\” + 取文本右边 (后缀名, 1), 画板1.取图片 (程序集_图像大小.宽度, 程序集_图像大小.高度))
  转换到BMP (取特定目录 (11) + “\” + 取文本右边 (后缀名, 1), 取特定目录 (11) + “\” + 取文本右边 (后缀名, 1) + “.bmp”)
  程序集_文件路径 = 取特定目录 (11) + “\” + 取文本右边 (后缀名, 1) + “.bmp”
  .如果真 (取文本右边 (程序集_文件路径, 4) = “.bmp”)
    BMP转ICO (读入文件 (程序集_文件路径), 图标资源)
    写到文件 (取运行目录 () + “\1.ico”, 图标资源)
    是否空图标 = 读入文件 (取运行目录 () + “\1.ico”)
    .如果真 (是否空图标 = { }) ' 如果方法一失败 自动转换方法二转ico
      BMP转ICO2 (读入文件 (程序集_文件路径), 图标资源)
      写到文件 (取运行目录 () + “\1.ico”, 图标资源)
    .如果真结束
  .如果真结束
  .如果 (画板的底图 = { })
    气球提示框1.弹出提示框 (取鼠标水平位置 (), 取鼠标垂直位置 (), “图标提取失败。”, -1, )
  .否则
    气球提示框1.弹出提示框 (取鼠标水平位置 (), 取鼠标垂直位置 (), “图标提取成功。”, -1, )
  .如果结束
.如果真结束
画板1.底图 = { }
.子程序 _编辑框1_内容被改变
.局部变量 图标数, 整数型
程序集_文件路径 = 编辑框1.内容
.如果真 (寻找文本 (程序集_文件路径, “.lnk”, , 真) ≠ -1)
  编辑框1.内容 = 查询快捷方式 (程序集_文件路径)
.如果真结束
图标数 = 取文件内图标数 (程序集_文件路径)
标题 = “发现图标数为:” + 到文本 (图标数) + “个”
编辑框1.被选择字符数 = 取文本长度 (程序集_文件路径)
.如果真 (图标数 = 0)
  气球提示框1.弹出提示框 (取鼠标水平位置 (), 取鼠标垂直位置 (), “文件内没有发现可用图标,如果放入的是图像将自动转换成为图标文件” + #换行符 + “如果不是图像将会转换失败!”, -1, 真)
.如果真结束
.子程序 _按钮_删除图标_被单击
.局部变量 i, 整数型
.如果真 (信息框 (“删除的仅是刚才提取的图标而且必须是非图像提取的图标”, #是否钮, ) = #是钮)
  i = 取文件内图标数 (程序集_欲删除的图标) ' 提取文件图标按钮被单击后 程序集才有会有数据
  .如果真 (i = 0)
    返回 ()
  .如果真结束
  .计次循环首 (取文件内图标数 (程序集_欲删除的图标), i)
    删除文件 (取运行目录 () + “\” + 到文本 (i) + “.ico”)
  .计次循环尾 ()
  程序集_欲删除的图标 = “”
.如果真结束
.子程序 _按钮_选择文件_被单击
通用对话框1.初始目录 = 取特定目录 (3)
通用对话框1.不改变目录 = 真
通用对话框1.过滤器 = “可执行文件(*.exe)|*.exe|动态链接库(*.dll)|*.dll|图标资源库(*.icl)|*.icl|图像文件(*.bmp;*.jpg;*.jpeg;*.gif;*.ico)|*.bmp;*.jpg;*.jpeg;*.gif;*.ico|所有文件(*.*)|*.*”
.如果真 (通用对话框1.打开 () = 真)
  编辑框1.内容 = 通用对话框1.文件名
.如果真结束
.子程序 BMP转ICO, 逻辑型, 公开, 用位图转换,非本人所写
.参数 被转BMP数据, 字节集
.参数 获得ICO数据, 字节集, 参考
.参数 透明色, 整数型, 可空, 默认为白色
.参数 CUR光标, 逻辑型, 可空, 真为CUR光标,假为图标
.参数 指针左热点, 字节型, 可空, CUR光标为真时有效,以0开始
.参数 指针顶热点, 字节型, 可空, CUR光标为真时有效,以0开始
.局部变量 位图, 位图
.局部变量 IFH, ICONFILEHEADER
.局部变量 BIH, BITMAPINFOHEADER
.局部变量 RGBD, 字节集
.局部变量 FBY, 字节集
.局部变量 I
.局部变量 J
.局部变量 K1
.局部变量 K2
.局部变量 BY
.局部变量 BYY
.局部变量 BY2
.局部变量 字节集, 字节集
.局部变量 宽度, 整数型
.局部变量 高度, 整数型
.局部变量 A, 整数型
.局部变量 TMZ, 整数型
.局部变量 DD, 整数型
.局部变量 补码, 整数型
.如果真 (位图.载入数据 (被转BMP数据) = 假)
  返回 (假)
.如果真结束
宽度 = 位图.取宽度 ()
.如果真 (宽度 > 255)
  返回 (假)
.如果真结束
高度 = 位图.取高度 ()
.如果真 (高度 > 255)
  返回 (假)
.如果真结束
.如果 (宽度 % 32 ≠ 0)
  TMZ = 宽度 ÷ 32 + 1
.否则
  TMZ = 宽度 ÷ 32
.如果结束
TMZ = TMZ × 高度
补码 = 宽度 % 4
IFH.idReserved = 0
IFH.idType = 选择 (CUR光标, 2, 1)
IFH.idCount = 1
IFH.bHeight = 高度
IFH.bWidth = 宽度
IFH.bColorCount = 0
IFH.bReserved = 0
IFH.wPlanes = 选择 (CUR光标, 指针左热点, 1)
IFH.wBitCount = 选择 (CUR光标, 指针顶热点, 24)
IFH.dwBytesInRes = 宽度 × 高度 × 3 + TMZ × 4 + 补码 × 高度 + 40 ' 3240
IFH.dwImageOffset = 22 ' 取文本长度 (ifh)
BIH.biSize = 40 ' 取文本长度 (bih)
BIH.biWidth = 宽度
BIH.biHeight = 高度 × 2 ' !!!
BIH.iPlanes = 1
BIH.biBitCount = 24
BIH.biCompression = 0
BIH.biSizeImage = 宽度 × 高度 × 3 + 补码 × 高度 ' 3200
BIH.biXPelsPerMeter = 0
BIH.biYPelsPerMeter = 0
BIH.biClrUsed = 0
BIH.biClrImportant = 0
.如果 (是否为空 (透明色))
  BY = 16777215
.否则
  BY = 透明色
.如果结束
RGBD = 取空白字节集 (BIH.biSizeImage)
FBY = 取空白字节集 (TMZ × 4)
K1 = 0
K2 = 1
A = 128
.计次循环首 (高度, I) ' 从左下角逐行扫描
  .计次循环首 (宽度, J)
    BYY = 位图.取某点颜色 (J - 1, 高度 - I) ' 获得图像上某一点的颜色Long值
    .如果 (BYY ≠ BY) ' 如果该点为透明色
      RGBD [K1 + 3] = 位与 (BYY, 255) ' 取整 (BYY ÷ 65536)
      RGBD [K1 + 2] = 位与 (右移 (BYY, 8), 255)
      RGBD [K1 + 1] = 右移 (BYY, 16)
    .否则
      BY2 = BY2 + A
    .如果结束
    K1 = K1 + 3
    A = A ÷ 2
    .如果真 (A = 0)
      FBY [K2] = BY2
      K2 = K2 + 1
      A = 128
      BY2 = 0
    .如果真结束
  .计次循环尾 ()
  .如果真 (A ≠ 128)
    FBY [K2] = BY2
    K2 = K2 + 1
    A = 128
    BY2 = 0
  .如果真结束
  DD = K2 % 4
  .如果真 (DD ≠ 1)
    K2 = K2 + 5 - DD
  .如果真结束
  K1 = K1 + 补码
.计次循环尾 ()
获得ICO数据 = 取空白字节集 (22)
拷贝内存_ICONFILEHEADER (获得ICO数据, IFH, 22)
字节集 = 取空白字节集 (40)
拷贝内存_BITMAPINFOHEADER (字节集, BIH, 40)
获得ICO数据 = 获得ICO数据 + 字节集 + RGBD + FBY
返回 (真)
.子程序 BMP转ICO2, 逻辑型, 公开, 用数据转换,非本人所写
.参数 被转BMP数据, 字节集
.参数 获得ICO数据, 字节集, 参考
.参数 透明色, 整数型, 可空, 默认为白色
.参数 CUR光标, 逻辑型, 可空, 真为CUR光标,假为图标
.参数 指针左热点, 字节型, 可空, CUR光标为真时有效,以0开始
.参数 指针顶热点, 字节型, 可空, CUR光标为真时有效,以0开始
.局部变量 BMP数据2, 字节集
.局部变量 IFH, ICONFILEHEADER
.局部变量 BIH, BITMAPINFOHEADER
.局部变量 RGBD, 字节集
.局部变量 FBY, 字节集
.局部变量 I
.局部变量 J
.局部变量 K1
.局部变量 K2
.局部变量 BY, RGBDATA
.局部变量 BYY, RGBDATA
.局部变量 BY2
.局部变量 字节集, 字节集
.局部变量 宽度, 整数型
.局部变量 高度, 整数型
.局部变量 长度, 整数型
.局部变量 A, 整数型
.局部变量 TMZ, 整数型
.局部变量 DD, 整数型
.局部变量 补码, 整数型
.如果真 (取字节集长度 (被转BMP数据) < 54 或 被转BMP数据 [1] ≠ 66 或 被转BMP数据 [2] ≠ 77) ' BM6
  返回 (假)
.如果真结束
宽度 = 取字节集数据 (被转BMP数据, #整数型, 19)
高度 = 取字节集数据 (被转BMP数据, #整数型, 23)
长度 = 取字节集数据 (被转BMP数据, #整数型, 35)
.如果真 (宽度 > 255)
  返回 (假)
.如果真结束
.如果真 (高度 > 255)
  返回 (假)
.如果真结束
BMP数据2 = 取字节集中间 (被转BMP数据, 55, 长度)
.如果 (宽度 % 32 ≠ 0)
  TMZ = 宽度 ÷ 32 + 1
.否则
  TMZ = 宽度 ÷ 32
.如果结束
TMZ = TMZ × 高度
补码 = 宽度 % 4
IFH.idReserved = 0
IFH.idType = 选择 (CUR光标, 2, 1)
IFH.idCount = 1
IFH.bHeight = 高度
IFH.bWidth = 宽度
IFH.bColorCount = 0
IFH.bReserved = 0
IFH.wPlanes = 选择 (CUR光标, 指针左热点, 1)
IFH.wBitCount = 选择 (CUR光标, 指针顶热点, 24)
IFH.dwBytesInRes = 宽度 × 高度 × 3 + TMZ × 4 + 补码 × 高度 + 40 ' 3240
IFH.dwImageOffset = 22 ' 取文本长度 (ifh)
BIH.biSize = 40 ' 取文本长度 (bih)
BIH.biWidth = 宽度
BIH.biHeight = 高度 × 2 ' !!!
BIH.iPlanes = 1
BIH.biBitCount = 24
BIH.biCompression = 0
BIH.biSizeImage = 宽度 × 高度 × 3 + 补码 × 高度 ' 3200
BIH.biXPelsPerMeter = 0
BIH.biYPelsPerMeter = 0
BIH.biClrUsed = 0
BIH.biClrImportant = 0
.如果真 (取字节集长度 (BMP数据2) < BIH.biSizeImage)
  返回 (假)
.如果真结束
.如果 (是否为空 (透明色))
  BY.R = 255
  BY.G = 255
  BY.B = 255
.否则
  BY.R = 位与 (透明色, 255) ' 取整 (BYY ÷ 65536)
  BY.G = 位与 (右移 (透明色, 8), 255)
  BY.B = 右移 (透明色, 16)
.如果结束
RGBD = 取空白字节集 (BIH.biSizeImage)
FBY = 取空白字节集 (TMZ × 4)
K1 = 0
K2 = 1
A = 128
.计次循环首 (高度, I) ' 从左下角逐行扫描
  .计次循环首 (宽度, J)
    BYY.R = BMP数据2 [K1 + 3]
    BYY.G = BMP数据2 [K1 + 2]
    BYY.B = BMP数据2 [K1 + 1]
    .如果 (BYY.R ≠ BY.R 或 BYY.G ≠ BY.G 或 BYY.B ≠ BY.B) ' 如果该点为透明色
      RGBD [K1 + 3] = BYY.R
      RGBD [K1 + 2] = BYY.G
      RGBD [K1 + 1] = BYY.B
    .否则
      BY2 = BY2 + A
    .如果结束
    K1 = K1 + 3
    A = A ÷ 2
    .如果真 (A = 0)
      FBY [K2] = BY2
      K2 = K2 + 1
      A = 128
      BY2 = 0
    .如果真结束
  .计次循环尾 ()
  .如果真 (A ≠ 128)
    FBY [K2] = BY2
    K2 = K2 + 1
    A = 128
    BY2 = 0
  .如果真结束
  DD = K2 % 4
  .如果真 (DD ≠ 1)
    K2 = K2 + 5 - DD
  .如果真结束
  K1 = K1 + 补码
.计次循环尾 ()
获得ICO数据 = 取空白字节集 (22)
拷贝内存_ICONFILEHEADER (获得ICO数据, IFH, 22)
字节集 = 取空白字节集 (40)
拷贝内存_BITMAPINFOHEADER (字节集, BIH, 40)
获得ICO数据 = 获得ICO数据 + 字节集 + RGBD + FBY
返回 (真)
.子程序 检测图像欲转换大小
.如果真 (单选框_16.选中 = 真)
  程序集_图像大小.宽度 = 16
  程序集_图像大小.高度 = 16
  返回 ()
.如果真结束
.如果真 (单选框_32.选中 = 真)
  程序集_图像大小.宽度 = 32
  程序集_图像大小.高度 = 32
  返回 ()
.如果真结束
.如果真 (单选框_64.选中 = 真)
  程序集_图像大小.宽度 = 64
  程序集_图像大小.高度 = 64
  返回 ()
.如果真结束
.如果真 (单选框_128.选中 = 真)
  程序集_图像大小.宽度 = 128
  程序集_图像大小.高度 = 128
  返回 ()
.如果真结束
.子程序 _单选框_16_被单击
检测图像欲转换大小 ()
.子程序 _单选框_32_被单击
检测图像欲转换大小 ()
.子程序 _单选框_64_被单击
检测图像欲转换大小 ()
.子程序 _单选框_128_被单击
检测图像欲转换大小 ()
.子程序 __启动窗口_将被销毁
删除文件 (取特定目录 (11) + “\” + 取文本右边 (到小写 (取文本右边 (程序集_文件路径, 4)), 1))
删除文件 (取特定目录 (11) + “\” + 取文本右边 (到小写 (取文本右边 (程序集_文件路径, 4)), 1) + “.bmp”)

运行结果:

易语言如何实现提取ICO图标并支持多种图像格式转换功能

感谢你能够认真阅读完这篇文章,希望小编分享的“易语言如何实现提取ICO图标并支持多种图像格式转换功能”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注行业资讯频道,更多相关知识等着你来学习!