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