怎么用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实现手绘图片生成器”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

发布于 2022-02-15 20:43:17
收藏
分享
海报
0 条评论
49
上一篇:Python设计模式中命令模式怎么实现 下一篇:bootstrap如何实现滚动条
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码