Python小工具:图片转icns格式和ico格式
1、准备
(1)PyQt5开发的程序
(2)使用该项目单独的虚拟环境,必免将一些不必要的依赖打包到应用中
# 1、创建python虚拟环境
python -m venv venv
# 2、安装程序依赖,这开发时都已安装
# 3、虚拟环境安装pyinstaller
pip install pyinstaller
- 图片转icns格式: 一是:python代码转换,二是:shell脚本转换
python代码方式一:
import os
import shutil
import subprocess
# 图片输入路径
img_path = ""
# icns输出文件夹
icns_output_dir = ""
img_dir = os.path.dirname(img_path)
img_name = os.path.splitext(os.path.basename(img_path))[0]
icns_temp = f'{img_dir}/test.iconset'
if not os.path.exists(icns_temp):
os.makedirs(icns_temp)
if not os.path.exists(icns_output_dir):
os.makedirs(icns_output_dir)
ml = f'''
sips -z 16 16 {img_path} --out {icns_temp}/icon_16x16.png
sips -z 32 32 {img_path} --out {icns_temp}/icon_16x16@2x.png
sips -z 32 32 {img_path} --out {icns_temp}/icon_32x32.png
sips -z 64 64 {img_path} --out {icns_temp}/icon_32x32@2x.png
sips -z 128 128 {img_path} --out {icns_temp}/icon_128x128.png
sips -z 256 256 {img_path} --out {icns_temp}/icon_128x128@2x.png
sips -z 256 256 {img_path} --out {icns_temp}/icon_256x256.png
sips -z 512 512 {img_path} --out {icns_temp}/icon_256x256@2x.png
sips -z 512 512 {img_path} --out {icns_temp}/icon_512x512.png
sips -z 512 512 {img_path} --out {icns_temp}/icon_512x512@2x.png
'''
pic = subprocess.Popen(ml, shell=True)
pic.wait()
ml = f'iconutil -c icns {icns_temp} -o {icns_output_dir}/{img_name}.icns'
icon = subprocess.Popen(ml, shell=True)
icon.wait()
#删除临时文件
if os.path.exists(icns_temp):
shutil.rmtree(icns_temp)
python代码方式二:
# 安装依赖
pip install pillow
from PIL import Image
# 源图片路径
source_image_path = 'source_image.png' # 替换为你的图片文件名
# 目标ICO图片路径
target_ico_path = 'target_image.ico'
# 定义一个尺寸列表,可以是16, 32, 48, 64, 128, 256
sizes = [16, 32, 48, 64, 128, 256]
# 打开图片
image = Image.open(source_image_path)
# 转换为ICO格式
image.save(target_ico_path, 'ICO',sizes=sizes)
print(f'ICO图标已保存至: {target_ico_path}')
shell脚本方式:
# !/bin/bash
# 图片输入路径
input=$1;
# icns输出文件夹
output=$2;
if [ ! -f "$input" ]; then
echo "$input 文件不存在"
exit 0;
fi
current_folder=$(dirname "$inupt")
file_name_with_ext=$(basename "$input")
file_name="${file_name_with_ext%.*}"
if [ ! -d "$output" ]; then
echo "$output 文件夹不存在"
exit 0;
fi
mkdir icons.iconset
tmp="$current_folder/icons.iconset"
setIconImage(){
sips -z 16 16 $input --out $tmp/icon_16x16.png
sips -z 32 32 $input --out $tmp/icon_16x16@2x.png
sips -z 32 32 $input --out $tmp/icon_32x32.png
sips -z 64 64 $input --out $tmp/icon_32x32@2x.png
sips -z 64 64 $input --out $tmp/icon_64x64.png
sips -z 128 128 $input --out $tmp/icon_64x64@2x.png
sips -z 128 128 $input --out $tmp/icon_128x128.png
sips -z 256 256 $input --out $tmp/icon_128x128@2x.png
sips -z 256 256 $input --out $tmp/icon_256x256.png
sips -z 512 512 $input --out $tmp/icon_256x256@2x.png
sips -z 512 512 $input --out $tmp/icon_512x512.png
sips -z 1024 1024 $input --out $tmp/icon_512x512@2x.png
}
setIconImage
iconutil -c icns $tmp -o "$output/$file_name.icns"
rm -rf $tmp