
核心记住QImage用来读文件、修改像素、子线程处理图像CPU像素缓冲区QPixmap用来界面显示显卡渲染缓冲区只能主线程用两者可以互相转换fromPyQt5.QtWidgetsimportQWidget,QLabel,QApplicationfromPyQt5.QtGuiimportQPixmap,QImage,QColorfromPyQt5.QtCoreimportQtimportsys appQApplication(sys.argv)winQWidget()win.resize(800,500)# ---------------------- 1.QImage 示例操作像素 ----------------------# 方式1从文件加载QImageimgQImage(test.jpg)ifimg.isNull():print(图片加载失败)# 获取图片宽高wimg.width()himg.height()# 读取某个点像素颜色 (x,y)color:QColorimg.pixelColor(10,10)print(f坐标(10,10) R:{color.red()}G:{color.green()}B:{color.blue()})# 修改像素把(20,20)这个点改成红色img.setPixelColor(20,20,QColor(255,0,0))# 保存QImage到磁盘img.save(qimage_out.png)# ---------------------- 2.QImage → QPixmap给界面显示 ----------------------# QImage不能直接setPixmap给label必须转QPixmappixQPixmap.fromImage(img)label1QLabel(QPixmap显示,win)label1.setGeometry(10,10,400,400)label1.setPixmap(pix.scaled(label1.size(),Qt.KeepAspectRatio,Qt.SmoothTransformation))# ---------------------- 3.QPixmap 示例适合显示不适合改像素 ----------------------pix2QPixmap(test.jpg)# QPixmap没有 pixelColor / setPixelColor不能直接改像素# 如果一定要改像素必须先转QImageimg2pix2.toImage()# QPixmap转QImage修改像素img2.invertPixels()# 颜色取反pix3QPixmap.fromImage(img2)# 修改完转回QPixmap给UIlabel2QLabel(取反之后,win)label2.setGeometry(420,10,400,400)label2.setPixmap(pix3.scaled(label2.size(),Qt.KeepAspectRatio,Qt.SmoothTransformation))win.show()sys.exit(app.exec_())互相转换核心两行# QImage → QPixmap显示用pixQPixmap.fromImage(qimage_obj)# QPixmap → QImage修改像素用imgpixmap_obj.toImage()另一个场景从OpenCV Mat转很常用opencv读出来是BGR格式QImage默认RGB需要转换通道importcv2 matcv2.imread(test.jpg)h,w,chmat.shape# BGR转RGBmat_rgbcv2.cvtColor(mat,cv2.COLOR_BGR2RGB)# mat 转 QImageqimgQImage(mat_rgb.data,w,h,w*3,QImage.Format_RGB888)# QImage转QPixmap给label显示qpixQPixmap.fromImage(qimg)关键区别表格功能QImageQPixmap修改像素✅支持pixelColor/setPixelColor❌不能直接操作像素子线程使用✅可以❌只能主线程用途文件读写、算法处理、opencv交互给QLabel、按钮等控件显示图像底层存储CPU内存像素数组图形显卡缓存常见坑不要在子线程用QPixmap子线程加载处理图片全部用QImage处理完把QImage传到主线程再转QPixmap显示。QPixmap.fromImage()有些格式会丢失透明通道遇到png透明图注意。QImage构造传入外部data比如opencv的data时要保证原内存不被释放否则会花屏。