怎么用Python+PyQT5实现手绘图片生成器
怎么用Python+PyQT5实现手绘图片生成器
本篇内容主要讲解“怎么用Python+PyQT5实现手绘图片生成器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python+PyQT5实现手绘图片生成器”吧!
UI界面的整体部分代码块,UI界面的设计比较简单。效果在上面的图片展示。
classHandImage(QWidget):def__init__(self):super(HandImage,self).__init__()self.init_ui()definit_ui(self):'''UI界面组件及布局:return:'''self.setWindowTitle('手绘图片生成器公众号:[Python集中营]')self.setWindowIcon(QIcon('手绘图标.ico'))self.setFixedWidth(500)self.sou_im_path=QLineEdit()self.sou_im_path.setReadOnly(True)self.sou_im_path_btn=QPushButton()self.sou_im_path_btn.setText('源图片')self.sou_im_path_btn.clicked.connect(self.sou_im_path_btn_clk)self.dir_path=QLineEdit()self.dir_path.setReadOnly(True)self.dir_path_btn=QPushButton()self.dir_path_btn.setText('存储')self.dir_path_btn.clicked.connect(self.dir_path_btn_clk)self.start_btn=QPushButton()self.start_btn.setText('开始绘制图像')self.start_btn.clicked.connect(self.start_btn_clk)grid=QGridLayout()grid.addWidget(self.sou_im_path,0,0,1,1)grid.addWidget(self.sou_im_path_btn,0,1,1,1)grid.addWidget(self.dir_path,1,0,1,1)grid.addWidget(self.dir_path_btn,1,1,1,1)grid.addWidget(self.start_btn,2,0,1,2)self.thread_=WorkThread(self)self.thread_.finished.connect(self.finished)self.setLayout(grid)#UI界面上的槽函数defsou_im_path_btn_clk(self):'''选择源图片并设置路径:return:'''im_path=QFileDialog.getOpenFileName(self,os.getcwd(),'打开图片','ImageFile(*.jpg);;ImageFile(*.png)')self.sou_im_path.setText(im_path[0])defdir_path_btn_clk(self):'''选择存储路径并设置路径:return:'''dir_path=QFileDialog.getExistingDirectory(self,os.getcwd(),'选择路径')self.dir_path.setText(dir_path)defstart_btn_clk(self):'''开始按钮绑定的槽函数:return:'''self.start_btn.setEnabled(False)self.thread_.start()deffinished(self,finished):'''用于子线程传递完成信号的槽函数:paramfinished:信号变量:return:'''iffinishedisTrue:self.start_btn.setEnabled(True)
其中绘图用到的第三方库只有两个,主要的还是Pillow图像处理库,还有就是numpy科学计算库用于一些数组计算等的操作。
将第三方的处理库导入到代码块中
fromPILimportImage#图像处理模块importnumpyasnp#科学计算库#PyQt5界面制作及样式、核心组件fromPyQt5.QtGuiimport*fromPyQt5.QtWidgetsimport*fromPyQt5.QtCoreimport*#应用基础操作相关importsysimportos
创建用于专门手绘图像的子线程类,将UI界面的处理逻辑和生成图像的处理逻辑分开不至于产生无响应的卡死状态。
classWorkThread(QThread):finished=pyqtSignal(bool)def__init__(self,parent=None):super(WorkThread,self).__init__(parent)self.parent=parentself.working=Truedef__del__(self):self.working=Falseself.wait()defrun(self):#源图片路径sou_im_path=self.parent.sou_im_path.text().strip()#存储路径dir_path=self.parent.dir_path.text().strip()ifsou_im_path==''ordir_path=='':self.finished.emit(True)return#打开需要进行转的图像,并进行参数设置,取出来的参数主要图像的一些梯度值。最后进行数组保存。vals=np.asarray(Image.open(sou_im_path).convert('L')).astype('float')'''图像参数处理'''depth=12.0#设置初始化深度gray_vals=np.gradient(vals)#提取图像灰度的梯度值gray_x,gray_y=gray_vals#单独提取横坐标与纵坐标的灰度值print('当前横坐标的灰度值:',gray_x)print('当前纵坐标的灰度值:',gray_y)#重新设置横坐标合纵坐标的灰度值gray_x=gray_x*depth/100.0gray_y=gray_y*depth/100.0#根据numpy.sqrt()函数计算横坐标和纵坐标灰度值的平方根gray_sqrt=np.sqrt(gray_x**2+gray_y**2+1.0)#重新计算X轴、Y轴、Z轴的光源light_x=gray_x/gray_sqrtlight_y=gray_y/gray_sqrtlight_z=1.0/gray_sqrt#计算光源的方位角度、俯视角度agnle_el=np.pi/2.2#俯视角度agnle_az=np.pi/4.#方位角度#分别计算光源对X轴、Y轴、Z轴的影响dx=np.cos(agnle_el)*np.cos(agnle_az)#光源对x轴的影响dy=np.cos(agnle_el)*np.sin(agnle_az)#光源对y轴的影响dz=np.sin(agnle_el)#光源对z轴的影响#设置光源归一化处理light=255*(dx*light_x+dy*light_y+dz*light_z)light=light.clip(0,255)#重新构建图像image=Image.fromarray(light.astype('uint8'))image.save(dir_path+'/手绘图像.jpg')self.finished.emit(True)print('手绘图像绘制完成!')
主要代码块实现都在上面了,下面将展示完整的代码
完整代码
#-*-coding:utf-8-*-#@authorPython集中营#@date2022/2/10#@filetest2.py#done#手绘图片生成器:以雪容融为例一键生成...#手绘图片生成器可以将导入的彩色图片通过python分析光源、灰度等操作生成手绘图片。#其中绘图用到的第三方库只有两个,主要的还是Pillow图像处理库,还有就是numpy科学计算库用于一些数组计算等的操作。#将第三方的处理库导入到代码块中fromPILimportImage#图像处理模块importnumpyasnp#科学计算库#PyQt5界面制作及样式、核心组件fromPyQt5.QtGuiimport*fromPyQt5.QtWidgetsimport*fromPyQt5.QtCoreimport*#应用基础操作相关importsysimportos#创建用于专门手绘图像的子线程类,将UI界面的处理逻辑和生成图像的处理逻辑分开不至于产生无响应的卡死状态。classWorkThread(QThread):finished=pyqtSignal(bool)def__init__(self,parent=None):super(WorkThread,self).__init__(parent)self.parent=parentself.working=Truedef__del__(self):self.working=Falseself.wait()defrun(self):#源图片路径sou_im_path=self.parent.sou_im_path.text().strip()#存储路径dir_path=self.parent.dir_path.text().strip()ifsou_im_path==''ordir_path=='':self.finished.emit(True)return#打开需要进行转的图像,并进行参数设置,取出来的参数主要图像的一些梯度值。最后进行数组保存。vals=np.asarray(Image.open(sou_im_path).convert('L')).astype('float')'''图像参数处理'''depth=12.0#设置初始化深度gray_vals=np.gradient(vals)#提取图像灰度的梯度值gray_x,gray_y=gray_vals#单独提取横坐标与纵坐标的灰度值print('当前横坐标的灰度值:',gray_x)print('当前纵坐标的灰度值:',gray_y)#重新设置横坐标合纵坐标的灰度值gray_x=gray_x*depth/100.0gray_y=gray_y*depth/100.0#根据numpy.sqrt()函数计算横坐标和纵坐标灰度值的平方根gray_sqrt=np.sqrt(gray_x**2+gray_y**2+1.0)#重新计算X轴、Y轴、Z轴的光源light_x=gray_x/gray_sqrtlight_y=gray_y/gray_sqrtlight_z=1.0/gray_sqrt#计算光源的方位角度、俯视角度agnle_el=np.pi/2.2#俯视角度agnle_az=np.pi/4.#方位角度#分别计算光源对X轴、Y轴、Z轴的影响dx=np.cos(agnle_el)*np.cos(agnle_az)#光源对x轴的影响dy=np.cos(agnle_el)*np.sin(agnle_az)#光源对y轴的影响dz=np.sin(agnle_el)#光源对z轴的影响#设置光源归一化处理light=255*(dx*light_x+dy*light_y+dz*light_z)light=light.clip(0,255)#重新构建图像image=Image.fromarray(light.astype('uint8'))image.save(dir_path+'/手绘图像.jpg')self.finished.emit(True)print('手绘图像绘制完成!')#UI界面的整体部分代码块,UI界面的设计比较简单。效果在下面的图片展示。classHandImage(QWidget):def__init__(self):super(HandImage,self).__init__()self.init_ui()definit_ui(self):'''UI界面组件及布局:return:'''self.setWindowTitle('手绘图片生成器公众号:[Python集中营]')self.setWindowIcon(QIcon('手绘图标.ico'))self.setFixedWidth(500)self.sou_im_path=QLineEdit()self.sou_im_path.setReadOnly(True)self.sou_im_path_btn=QPushButton()self.sou_im_path_btn.setText('源图片')self.sou_im_path_btn.clicked.connect(self.sou_im_path_btn_clk)self.dir_path=QLineEdit()self.dir_path.setReadOnly(True)self.dir_path_btn=QPushButton()self.dir_path_btn.setText('存储')self.dir_path_btn.clicked.connect(self.dir_path_btn_clk)self.start_btn=QPushButton()self.start_btn.setText('开始绘制图像')self.start_btn.clicked.connect(self.start_btn_clk)grid=QGridLayout()grid.addWidget(self.sou_im_path,0,0,1,1)grid.addWidget(self.sou_im_path_btn,0,1,1,1)grid.addWidget(self.dir_path,1,0,1,1)grid.addWidget(self.dir_path_btn,1,1,1,1)grid.addWidget(self.start_btn,2,0,1,2)self.thread_=WorkThread(self)self.thread_.finished.connect(self.finished)self.setLayout(grid)#UI界面上的槽函数defsou_im_path_btn_clk(self):'''选择源图片并设置路径:return:'''im_path=QFileDialog.getOpenFileName(self,os.getcwd(),'打开图片','ImageFile(*.jpg);;ImageFile(*.png)')self.sou_im_path.setText(im_path[0])defdir_path_btn_clk(self):'''选择存储路径并设置路径:return:'''dir_path=QFileDialog.getExistingDirectory(self,os.getcwd(),'选择路径')self.dir_path.setText(dir_path)defstart_btn_clk(self):'''开始按钮绑定的槽函数:return:'''self.start_btn.setEnabled(False)self.thread_.start()deffinished(self,finished):'''用于子线程传递完成信号的槽函数:paramfinished:信号变量:return:'''iffinishedisTrue:self.start_btn.setEnabled(True)if__name__=='__main__':app=QApplication(sys.argv)main=HandImage()main.show()sys.exit(app.exec_())
到此,相信大家对“怎么用Python+PyQT5实现手绘图片生成器”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...