有时我们需要给一些其他格式的图标转换成ico格式才能使用,比如pyinstaller打包python脚本的时候。一两个图标使用在线转换的方式还是可以接受的。但是需要转换的图标特别多的时候,在线转换就比较吃力了。
环境:windows 平台:python3 用到的模块:os,sys,PythonMagick
PythonMagick安装方式:https://blog.csdn.net/xgbm_k/article/details/73351272
主要代码:
import PythonMagick
img = PythonMagick.Image(r"F:\bird.png")
img.sample('256x256')
img.write(r'F:\bird.ico')
通过PythonMagick模块打开待转的图片,然后调整为需要的大小,最后直接保存为需要转码的格式即可。
以下为我自己写的一个批量处理一个文件夹内所有图片的代码:
# -*- coding: utf-8 -*-
import PythonMagick
import os
import sys
g_default_size = '256x256'
g_output = ''
g_valid_file_type = ['jpg', 'jpeg', 'png', 'ico', 'bmp']
def is_valid_file(f_path):
global g_valid_file_type
if os.path.splitext(f_path)[1][1:] in g_valid_file_type:
return True
return False
def change_pic_file_to_ico(f_path, o_path):
global g_default_size
if not is_valid_file(f_path):
print('Not a valid file type!')
print('Valid file type' + g_valid_file_type)
return False
img = PythonMagick.Image(f_path)
try:
img.sample(g_default_size)
except:
print('Error size: ' + g_default_size)
return False
img.write(o_path)
return True
def get_file_list_in_folder(f_path):
file_list = []
folder_list = []
name_list = os.listdir(f_path)
for name in name_list:
t_path = os.path.join(f_path, name)
if os.path.isfile(t_path):
if is_valid_file(t_path):
file_list.append(t_path)
continue
if os.path.isdir(t_path):
folder_list.append(t_path)
continue
print("Unknown path type: " + t_path)
for f in folder_list:
file_list += get_file_list_in_folder(f)
return file_list
def deal_folder(f_path):
global g_output
file_list = get_file_list_in_folder(f_path)
for f in file_list:
# 加1为了去除后面的反斜杠,防止join出错
o_path = os.path.join(g_output, f[len(f_path) + 1:])
o_path = os.path.splitext(o_path)[0] + '.ico'
o_folder = os.path.split(o_path)[0]
if not os.path.exists(o_folder):
os.mkdir(o_folder)
change_pic_file_to_ico(f, o_path)
def Usage(name):
print('Usagee:')
print(' ' + name + ' + <folder name, file name> + (size) + (output)')
print(' ' + 'folder name, file name必选一个, size 默认 256x256,')
print(' output默认与file name名相同,后缀为ico, 若输入为folder name,')
print(' 则在同级目录下新建同名+_ico的目录,生成的文件都放在此目录下')
os.system('pause')
def main():
global g_default_size, g_output
if len(sys.argv) < 2:
Usage(sys.argv[0])
i_path = sys.argv[1]
if not os.path.exists(i_path):
print('Error: path not exist!')
print(i_path)
if len(sys.argv) > 2:
g_default_size = sys.argv[2]
if len(sys.argv) > 3:
g_output = sys.argv[3]
if os.path.isfile(i_path):
if g_output == '':
g_output = os.path.splitext(i_path)[0] + '.ico'
change_pic_file_to_ico(i_path, g_output)
if os.path.isdir(i_path):
g_output = i_path + '_ico'
deal_folder(i_path)
if __name__ == '__main__':
main()
使用pyinstaller打包后的文件:
链接:https://pan.baidu.com/s/1GKyy23UQggm55amuGuWK_w 提取码:nhct