在图片写字的实现,有很多方法,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种字体,放到当前的目录下
# 用下拉框进行选择,用绝对路径比较安全,相对路径在不同的地方运行可能会报错。
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_())
简陋的页面。。。先这样把,有待修改
比如
这样选择
点击确定,会弹出颜色选择框
选择之后
就完成了
哈哈哈哈哈