Pyqt5+PIL在图片上写字

前言

在图片写字的实现,有很多方法,opencv,或者自己用手写,哈哈哈哈哈哈哈。

写字的实现,我选择用的是PIL中的ImageFont,ImageDraw。

没有PIL,可以 pip install pillow。

用pyqt5其实就实现了调用和选择功能,看着舒服。

核心是PIL。

正文

写字的代码

from PIL import Image,ImageFont,ImageDraw
    def write_for_picture(self,path,fonts,rename,place:tuple,text:str,font_size:int,color:tuple):
        """
        :param rename: 重用名
        :param fonts: 字体的选择
        :param path: 路径
        :param place: 写的位置
        :param text: 写什么
        :param font_size:字体大小
        :param color:  字体颜色
        :return:
        """
        img = Image.open(path)
        font = ImageFont.truetype(rf'C:\Users\520\PycharmProjects\pythonProject1\图片\字体\{fonts}.ttf', font_size)
        draw = ImageDraw.Draw(img)
        draw.text(place, text, font=font, fill=color)
        img.save(rename)
# 参数比较多,其中字体的选择本来想用字体对话框或者字体下拉列表,但都得不到字体的路径,也就放不到truetype# 中,就无法设置字体,退而求其次。
# window系统的字体在c:/Windows/Fonts中,大部分字体都不好玩,就从中选了4种字体,放到当前的目录下
# 用下拉框进行选择,用绝对路径比较安全,相对路径在不同的地方运行可能会报错。

pyqt5的代码

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from 图片.picture.two import wei
# 导入封装了上面代码的类
from init import picturepath
# 图片路径
class a(QWidget):
    def __init__(self):
        super().__init__()
        self.font = None
        self.color = None
        self.ok = None
        self.picture=wei()
        self.size_box = None
        self.textbrowser = None
        self.y = None
        self.x = None
        self.rename_qe = None
        self.size = None
        self.place = None
        self.content = None
        self.rename = None
        self.choose_picture = None
        self.choose_picture_qe = None
        self.initui()
# 初始化。initui里面全是控件,看图(下面)
#左边一般是label,右边输入框或者下拉列表框
#最下面是按钮,最右边是写的内容,
# 没有对lineedit的内容进行限制,
# 确定按钮有一个点击事件
    def initui(self):
        self.resize(839, 545)
        self.setWindowTitle("图片添加文字")        
        self.choose_picture_qe = QComboBox(self)
        self.choose_picture_qe.addItems(self.picture.get_name())
# get_name,是一个方法,用的os,得到图片的名字。返回一个列表
        self.choose_picture_qe.setGeometry(170, 50, 87, 22)

        self.choose_picture = QLabel(self)
        self.choose_picture.setText("选择图片")
        self.choose_picture.setGeometry(80, 60, 72, 15)

        self.choose_font = QLabel(self)
        self.choose_font.setText("选择字体")
        self.choose_font.setGeometry(80, 90, 72, 15)

        self.font=QComboBox(self)
        self.font.setGeometry(180, 90, 62, 25)
        self.font.addItems(['黑体','仿宋','楷体','新宋体'])

        self.rename = QLabel(self)
        self.rename.setText("重命名")
        self.rename_qe.setPlaceholderText('1.jpg/1.png')
        self.rename.setGeometry(80, 130, 72, 15)

        self.rename_qe = QLineEdit(self)
        self.rename_qe.setGeometry(170, 130, 161, 21)

        self.place = QLabel(self)
        self.place.setText("位置")
        self.place.setGeometry(90, 210, 72, 15)

        self.x = QLineEdit(self)
        self.x.setGeometry(170, 190, 113, 21)

        self.y = QLineEdit(self)
        self.y.setGeometry(170, 220, 113, 21)

        self.content = QLabel(self)
        self.content.setText("内容")
        self.content.setGeometry(420, 90, 72, 15)

        self.textbrowser = QTextEdit(self)
        self.textbrowser.setGeometry(420, 110, 271, 221)

        self.size_box= QComboBox(self)
        self.size_box.addItems(['10','20','30','40','50','60','70','80','90','100'])
        self.size_box.setGeometry(170, 270, 121, 22)

        self.size = QLabel(self)
        self.size.setText("大小")
        self.size.setGeometry(90, 280, 72, 15)

        self.ok=QPushButton(self)
        self.ok.setText('确定')
        self.ok.clicked.connect(self.sure)
        self.ok.setGeometry(90, 320, 60, 35)
# 得到写的内容,没写完全,在sure中会有错误对话框来提示数据不完整
    def get_data(self):
        path=self.choose_picture_qe.currentText()
        font=self.font.currentText()
        rename=self.rename_qe.text()
        x=self.x.text()
        y=self.y.text()
        content=self.textbrowser.toPlainText()
        size=self.size_box.currentText()
        color=QColorDialog.getColor()
        a=color.getRgb()[:-1]
# getRgb会返回有4个数据,最后一个不要
        self.color=a
        b=[path,font,rename,x,y,content,size]
        return b
    def sure(self):
        data=self.get_data()
        if "" in data:
            QMessageBox.critical(self, '错误', '数据不完整', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
            return 
        else:
            self.picture.write_for_picture(picturepath+f'/{data[0]}',data[1],data[2],(int(data[3]),int(data[4])),data[5],int(data[6]),self.color)
            self.close()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle(QStyleFactory.create('Fusion'))
    a = a()
    a.show()
    sys.exit(app.exec_())

Pyqt5+PIL在图片上写字_第1张图片

简陋的页面。。。先这样把,有待修改

操作

比如

这样选择

Pyqt5+PIL在图片上写字_第2张图片

点击确定,会弹出颜色选择框

Pyqt5+PIL在图片上写字_第3张图片

选择之后

就完成了

哈哈哈哈哈

Pyqt5+PIL在图片上写字_第4张图片

你可能感兴趣的:(python,开发语言,qt5)