您好,登錄后才能下訂單哦!
這篇文章主要介紹了易語言如何實現提取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圖標并支持多種圖像格式轉換功能”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。