first commit
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
from PIL import Image, ImageEnhance, ImageFilter
|
||||
|
||||
def convert_png_to_ico(png_path, ico_path, sizes=None, resample=Image.LANCZOS, sharpen=False):
|
||||
"""
|
||||
将PNG图片转换为ICO图标文件,同时优化圆角效果
|
||||
|
||||
参数:
|
||||
- png_path: 输入PNG文件路径
|
||||
- ico_path: 输出ICO文件路径
|
||||
- sizes: 图标尺寸列表
|
||||
- resample: 重采样方法,默认为Image.LANCZOS
|
||||
- sharpen: 是否应用锐化滤镜
|
||||
"""
|
||||
if sizes is None:
|
||||
sizes = [(16, 16), (32, 32), (48, 48), (64, 64), (256, 256)]
|
||||
|
||||
try:
|
||||
with Image.open(png_path) as img:
|
||||
# 确保图片为RGBA模式
|
||||
if img.mode != 'RGBA':
|
||||
img = img.convert('RGBA')
|
||||
|
||||
# 检查是否有透明通道
|
||||
has_transparency = False
|
||||
if img.mode == 'RGBA':
|
||||
alpha = img.getchannel('A')
|
||||
if alpha.getextrema()[0] < 255:
|
||||
has_transparency = True
|
||||
|
||||
# 为每个尺寸创建单独的图像
|
||||
icon_sizes = []
|
||||
for size in sizes:
|
||||
# 调整图片尺寸
|
||||
if size[0] < img.size[0] or size[1] < img.size[1]:
|
||||
# 缩小图片时使用高质量重采样算法
|
||||
resized_img = img.resize(size, resample=resample)
|
||||
else:
|
||||
# 放大图片时使用NEAREST算法避免模糊(适用于需要清晰边缘的情况)
|
||||
resized_img = img.resize(size, resample=Image.NEAREST)
|
||||
|
||||
# 应用锐化滤镜(可选)
|
||||
if sharpen:
|
||||
enhancer = ImageEnhance.Sharpness(resized_img)
|
||||
resized_img = enhancer.enhance(1.5) # 增强锐度
|
||||
|
||||
icon_sizes.append(resized_img)
|
||||
|
||||
# 保存为ICO文件
|
||||
if len(icon_sizes) > 0:
|
||||
# 使用第一个尺寸作为主图标
|
||||
icon_sizes[0].save(
|
||||
ico_path,
|
||||
format='ICO',
|
||||
sizes=[(img.size[0], img.size[1]) for img in icon_sizes]
|
||||
)
|
||||
print(f"成功将 {png_path} 转换为 {ico_path}")
|
||||
print(f"包含尺寸: {sizes}")
|
||||
if has_transparency:
|
||||
print("注意:已保留图片的透明通道(圆角效果)")
|
||||
else:
|
||||
print("图片没有检测到透明通道(可能没有圆角效果)")
|
||||
else:
|
||||
print("错误:未指定有效尺寸")
|
||||
|
||||
except Exception as e:
|
||||
print(f"转换失败: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 输入和输出文件路径
|
||||
png_path = 'app.png'
|
||||
ico_path = 'favicon.ico'
|
||||
|
||||
# 调用函数进行转换,禁用锐化处理
|
||||
convert_png_to_ico(png_path, ico_path, sizes=[(256, 256)], sharpen=False)
|
||||
Reference in New Issue
Block a user