服务器之家

服务器之家 > 正文

易语言提取ICO图标支持多种图像格式转换的代码

时间:2022-02-22 15:35     来源/作者:易语言源码教程

DLL命令表

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

自定义数据类型表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.版本 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图标

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
.版本 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图标支持多种图像格式转换的代码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接

标签:

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
返回顶部