python制作HEIC转JPG工具

近日家中小朋友上幼儿园了,老师每周都会给小朋友拍照发到群里,总有那么几次,图片是HEIC格式的,电脑查看不了,只能下载支持heic格式的图片查看器,一怒之下就有了本文的东西。

本文使用Tkinker和一个第三方包pyheif,而且windows上不支持直接pip,只能自己下载https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyheif 。记得版本要选择跟你当前python版本一致的哟。

先给大家看个预览:

但是当我打包exe的时候,pyheif提示出了一些问题,不知道是pyheif不支持win还是我的操作问题,有哪位大神打包exe成功了为小弟解下惑。

因为用的是pyheif第三方包,所以我也觉得没什么可以特别说明的,直接上代码应该是没问题的,如果真有不懂得,可以私信我:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/python
# -*-coding:utf-8 -*-
# @Time : 2021/12/22 14:56
# @Author : 托小尼
# @Email : 646547989@qq.com
# @URI : https://www.diandian100.cn
# @File : main.py
# @Desc :HEIC转JPG
import os
import tkinter
from threading import Thread
from tkinter import filedialog
from tkinter import Tk
from PIL import Image

import pyheif


class HeicToJpg:
"""heic转jpg"""

def __init__(self):
self.window = Tk()
# 设定窗体图标
self.window.iconbitmap(r'F:\projects\guistudy\favicon.ico')
# 这里四个参数分别为:宽、高、左、上
self.window.geometry("510x250+750+200")
# 禁止缩放
self.window.resizable(width=False, height=False)
# 设定标题
self.window.title("HEIC转换JPG ——Author by 托小尼")
self.strResult = tkinter.StringVar()
# 转换按钮,点击执行path_call_back
self.btnPath = tkinter.Button(self.window,
text='选择并转换',
width=70,
command=self.path_call_back)
# 设定多行文本框
self.txtResult = tkinter.Text(self.window, width=70, height=15)
# 设定grid布局
self.txtResult.grid(row=1, column=0, padx=5, pady=5)
# 在多行文本框的最后添加一下文字
self.txtResult.insert(tkinter.END, '转换任务列表……\n')
self.btnPath.grid(row=2, column=0, padx=5, pady=5)

self.window.mainloop()

def heic_to_jpg(self, file):
"""heic转jpg"""
# 转换后的jpg保存目录路径(即原始图片(heic)目录)
save_dir = os.path.dirname(file)
# 转换后的jpg保存完整路径
jpg_path = os.path.join(save_dir, '%s.jpg' % os.path.splitext(os.path.basename(file))[0])
# 读取heic文件
heic_path = pyheif.read(file)
# 转换并保存jpg文件
img_bytes = Image.frombytes(mode=heic_path.mode, size=heic_path.size, data=heic_path.data)
img_bytes.save(jpg_path, format='jpeg')
# 图片转换完打印成功提示在多行文本框最下方
self.txtResult.insert(tkinter.END, '【%s】转换完成\n' % file)
# 更新文本框内容
self.txtResult.update()
# 显示文本框的尾部
self.txtResult.see(tkinter.END)

def path_call_back(self):
"""读取要转换的文件"""
# 打开文件选择框选择heic图片
file_paths = filedialog.askopenfilenames(title='请选择您要转换的HEIC文件(*可多选)', filetypes=[('HEIC文件', '*.heic'), ])
# 如果有要装换的文件,清空多行文本狂已有内容
if file_paths:
self.txtResult.delete(0.0, tkinter.END)
# 更新文本框内容
self.txtResult.update()
# 打开一个线程去执行该次任务
for file in file_paths:
t = Thread(target=self.heic_to_jpg, args=(file,))
t.start()


if __name__ == '__main__':
HeicToJpg()

的确,为了转换速度更加迅速,特意增加了多线程去处理图片转换。

本来写完了准备发布,想到可能真的有伸手党会拿代码,索性每行加个注释吧,万一有人爱学习呢。