ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

<Python>基于智谱AI图像大模型的图像生成程序(CogView)

2026/9/9 6:10:58 拓冰建站 浏览量
<Python>基于智谱AI图像大模型的图像生成程序(CogView)

前言
本文是基于智谱AI大模型的图像生成模型CogView,使用PyQt5搭建自定义UI界面,CogView接口根据输入的提示词生成图片,然后将图片显示,并且可以保存到本地。
在这里插入图片描述
程序界面大致如上,未做过多美化,目前仅以功能实现。

配置:
平台:windows
工具:visual studio code
语言:python
库:PyQt5、zhipuAI接口

程序主要实现几方面的功能,首先是图片生成,这个是基于智谱AI大模型的,需要调用智谱的APIkey:
在这里插入图片描述
智谱官方提供了示例代码:

from zhipuai import ZhipuAI   
client = ZhipuAI(api_key="") # 请填写您自己的APIKeyresponse = client.images.generations(model="cogview", #填写需要调用的模型名称prompt="一只可爱的小猫咪",
)
print(response.data[0].url)

这段程序可以直接复制使用,需要做的是把其中的api_key参数处填上你自己的实际APIkey。

UI界面的构建使用到PyQt5库,这个比较简单,这里主要说一下多线程。因为大模型生成图片是同步模式,当执行时,UI界面会卡住,所以需要在子线程中去执行“图片生成”,然后将生成的图片URL传回主线程。
这里就涉及到一个线程间数据传递的问题,我也是因为这个,又去专门搜索了PyQt5中线程间数据如何传递,并记录在了一个专门的博文中:
<Python>PyQt5中在两个线程间传递数据实例记录
有兴趣的朋友可以去看看,本文不细说了。
直接看代码:
1、图片生成线程代码:

class Imagegenaratethread(QThread):       """图片生成线程"""#发送程序执行过程状态signal1=pyqtSignal(str)#发送生成的图片网址signal2=pyqtSignal(str)#发送图片生成进度值signal3=pyqtSignal(int)#发送错误提示signal4=pyqtSignal(str)def __init__(self,prompt:str):super().__init__()      self.prompt1=prompt    def run(self):self.img_draw_func(self.prompt1)def img_draw_func(self,prompt:str):self.signal1.emit('线程开始...')client = ZhipuAI(api_key="你的APIkey") # 请填写您自己的APIKey#去掉提示词中的空格prom=prompt.replace(" ","")print(prom)#判断提示词是否为空if prom != '':self.signal1.emit('生成中')response = client.images.generations(model="cogview", #填写需要调用的模型名称#prompt="一只可爱的小猫咪",prompt=prom,)url1=response.data[0].urlself.signal3.emit(100)print(url1)self.signal1.emit('图像生成完毕')self.signal2.emit(url1)self.signal1.emit('end')else:self.signal4.emit('请输入提示词!')

这是自定义的子线程,共声明了4个信号,分别发送过程状态、图片网址、生成进度值、错误提示4个信息。

在主线程中,我们需要去给子线程一个实例:

def img_draw_func(self):   """图片生成"""self.btn0.setEnabled(False)self.pb1.setValue(0)prompt11=self.te0.toPlainText()self.thread2=Imagegenaratethread(prompt11)self.thread2.signal1.connect(self.mm)self.thread2.signal2.connect(self.mm2)self.thread2.signal3.connect(self.mm3)self.thread2.signal4.connect(self.mm4)self.thread2.start()

我们实例化子线程,然后将子线程的signal1到signal4与主线程的函数连接起来。这样,每个signal发送时,会连接到相应函数,并且会传递参数值。我们就可以在主线程的函数中去处理子线程发送过来的数据了。

例如,我们在子线程生成号图片后,将图片URL发送出来:

self.signal2.emit(url1)

这个信号与主线程的mm2函数绑定:

self.thread2.signal2.connect(self.mm2)

我们在mm2函数处理图片:

@pyqtSlot(str)def mm2(self,dt):     """接收线程信息,更新图像路径"""#设置标签文本的超链接地址links1="<a href={}>{}</a>".format(dt,dt)self.lbl_imgurl2.setText(links1)self.lbl_imgurl2.adjustSize()self.lbl_imgurl2.setToolTip('打开链接(Ctrl+单击)')self.img_show_func(dt)

在函数mm2中,我们将子线程传过来的图片网址URL显示在一个标签上,并且给标签设置了超链接,这样我们可以直接点击标签的网址,就可以在浏览器打开生成的图片。
当然,我们还调用一个图片显示函数img_show_func

def img_show_func(self,url:str): """图片显示函数"""imgurl=urlresp=requests.get(imgurl)img_data=resp.contentimg=Image.open(BytesIO(img_data))w1,h1=img.sizeimg2=QImage(img.tobytes(),w1,h1,QImage.Format_RGB888)self.qimg=QPixmap.fromImage(img2)self.lbl_img.setPixmap(self.qimg)self.lbl_img.setScaledContents(True)self.lbl_imgsize2.setText(str(w1)+'x'+str(h1))

图片显示的实现,首先是使用requests去获取在线图片的数据,对于返回的图片元数据,我们使用Pillow库进行处理,最终将其转为QPixmap数据类型,这样就可以在Qlabel中显示。

完整代码:

import sys           
import requests   
import threading   from zhipuai import ZhipuAI   from PyQt5.QtCore import *   
from PyQt5.QtGui import *   
from PyQt5.QtWidgets import *   from PIL import Image,ImageQt   
from io import BytesIO   class Imagegenaratethread(QThread):   """图片生成线程"""#发送程序执行过程状态signal1=pyqtSignal(str)   #发送生成的图片网址signal2=pyqtSignal(str)   #发送图片生成进度值signal3=pyqtSignal(int)   #发送错误提示signal4=pyqtSignal(str)   def __init__(self,prompt:str):   super().__init__()      self.prompt1=prompt    def run(self):   self.img_draw_func(self.prompt1)def img_draw_func(self,prompt:str):   self.signal1.emit('线程开始...')client = ZhipuAI(api_key="你的APIkey") # 请填写您自己的APIKey#去掉提示词中的空格prom=prompt.replace(" ","")   print(prom)   #判断提示词是否为空if prom != '':   self.signal1.emit('生成中')   response = client.images.generations(   model="cogview", #填写需要调用的模型名称#prompt="一只可爱的小猫咪",prompt=prom,   )url1=response.data[0].url   self.signal3.emit(100)print(url1)   self.signal1.emit('图像生成完毕')self.signal2.emit(url1)self.signal1.emit('end')else:   self.signal4.emit('请输入提示词!')class Image_draw_with_text_win(QMainWindow):   """主线程"""def __init__(self):   super().__init__()self.initUI()def initUI(self):   self.qimg=QPixmap()self.lbl0=QLabel(self)self.lbl0.setGeometry(20,10,100,20)self.lbl0.setText('输入提示词:')self.te0=QTextEdit(self)self.te0.setGeometry(20,40,300,40)self.te0.setText('一只可爱的小猫咪')self.btn0=QPushButton('生成',self)   self.btn0.setGeometry(20,100,60,30)self.btn0.clicked.connect(self.img_draw_func)self.pb1=QProgressBar(self)self.pb1.setGeometry(120,100,200,30)self.pb1.setValue(0) self.pb1.setMaximum(100) #生成的图片尺寸显示self.lbl_imgsize=QLabel(self)self.lbl_imgsize.setGeometry(20,150,60,20)self.lbl_imgsize.setText('图片尺寸:')   self.lbl_imgsize2=QLabel(self)self.lbl_imgsize2.setGeometry(90,150,100,20)self.lbl_imgsize2.setStyleSheet("border:1px solid black;")   self.te_status=QTextEdit(self)self.te_status.setGeometry(20,180,300,200)self.te_status.setText('')self.lbl_img=QLabel(self)self.lbl_img.setGeometry(350,10,400,370)self.lbl_img.setStyleSheet("border:1px solid blue;")   #为标签设置右键菜单self.lbl_img.setContextMenuPolicy(Qt.CustomContextMenu)self.lbl_img.customContextMenuRequested.connect(self.create_rclick_menu)self.lbl_imgurl=QLabel(self)self.lbl_imgurl.setGeometry(20,400,100,20)self.lbl_imgurl.setText('生成的图像Url:')   self.lbl_imgurl2=QLabel(self)self.lbl_imgurl2.setGeometry(130,400,620,20)self.lbl_imgurl2.setText('')#设置标签的边框线条宽度self.lbl_imgurl2.setStyleSheet("border:1px solid black;")   self.lbl_imgurl2.setOpenExternalLinks(True)self.setWindowTitle('图像生成工具-基于智谱AI')self.setGeometry(100,30,800,480)self.setFixedSize(800,480)self.setWindowIcon(QIcon('ZPaiTest2024\\zpaiicon.png'))self.show()def create_rclick_menu(self):   """创建右键菜单"""self.menu12=QMenu(self)ac1=QAction('保存图片',self) self.menu12.addAction(ac1)ac1.triggered.connect(self.saveimage_func)  self.menu12.popup(QCursor.pos())def img_draw_func(self):   """图片生成"""self.btn0.setEnabled(False)self.pb1.setValue(0)prompt11=self.te0.toPlainText()self.thread2=Imagegenaratethread(prompt11)self.thread2.signal1.connect(self.mm)self.thread2.signal2.connect(self.mm2)self.thread2.signal3.connect(self.mm3)self.thread2.signal4.connect(self.mm4)self.thread2.start()@pyqtSlot(str)def mm(self,dt):   """接收线程信息,更新状态"""self.te_status.setText(dt)if dt=='end':   self.te_status.setText('')self.thread2.terminate()self.btn0.setEnabled(True)print(dt)   @pyqtSlot(str)def mm2(self,dt):   """接收线程信息,更新图像路径"""#设置标签文本的超链接地址links1="<a href={}>{}</a>".format(dt,dt)   self.lbl_imgurl2.setText(links1)self.lbl_imgurl2.adjustSize()self.lbl_imgurl2.setToolTip('打开链接(Ctrl+单击)')   self.img_show_func(dt)@pyqtSlot(int)def mm3(self,dt):   self.pb1.setValue(dt)@pyqtSlot(str)def mm4(self,dt):   """错误消息提示"""QMessageBox.information(self,'Tips!',dt)self.thread2.terminate()self.btn0.setEnabled(True)def img_show_func(self,url:str):   """图片显示函数"""imgurl=urlresp=requests.get(imgurl)img_data=resp.contentimg=Image.open(BytesIO(img_data))w1,h1=img.sizeimg2=QImage(img.tobytes(),w1,h1,QImage.Format_RGB888)self.qimg=QPixmap.fromImage(img2)self.lbl_img.setPixmap(self.qimg)self.lbl_img.setScaledContents(True)self.lbl_imgsize2.setText(str(w1)+'x'+str(h1))def saveimage_func(self):   """图片保存"""w1=self.qimg.size().width()h1=self.qimg.size().height()if w1>0 and h1 >0:   #self.dic = QFileDialog.getExistingDirectory(self, "保存地址", 'C:/')   self.fl1,_=QFileDialog.getSaveFileName(self,'保存','C:/',"图像文件(*.jpg *.png *.bmp *.jpeg)\nAll(*.*)")   print(self.fl1)try:   self.qimg.save(self.fl1)QMessageBox.information(self,'tips!','图片保存完毕')     except Exception as e:   QMessageBox.information(self, '输入提示', '异常: '+str(e))   else:   QMessageBox.information(self,'tips!','无图片数据')    if __name__ == '__main__':   app=QApplication(sys.argv)Idw=Image_draw_with_text_win()  sys.exit(app.exec_())

演示视频:

基于智谱AI的图像生成工具-python