Qt有四个类: QImage、QPixmap、q位图和q图片。 QImage专为I/O设计,针对直接像素访问和操作进行了优化。 QPixmap是为在屏幕上显示图像而设计和优化的。 QBitmap是一个从QPixmap继承的有用类。 如果QPixmap对象是位图,则其isQBitmap ()函数返回True,否则返回False。 QPicture类是一个绘图设备,可以记录和播放QPainter命令。
QPixmap配置文件QPixmap类可以将屏幕外图像作为绘图设备输出。 使用QLabel或QAbstractButton的子类,例如QPushbutton和QToolButton,可以方便地在屏幕上显示QPixmap。 因为QPixmap是QPaintDevice的子类,所以QPainter可以直接在QPixmap对象上绘制。
QPixmap提供了多种在创建QPixmap对象时加载图像文件的方法,以及在创建对象后使用load (或loadFrameData )函数加载图像的方法。 加载映像时,文件名可以是磁盘上的实际文件,也可以是嵌入到APP应用程序中的资源。 QPixmap读取的文件类型为BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等。
QPixmap常用方法:
复制(自,rect ) :将从QRect对象复制到QPixmap对象。 fromimage(image,flag ) :静态函数将QImage对象转换为QPixmap对象。 fill(self,color : QColor ) :用规定的color填充。 width(self ) :返回图像的宽度。 height(self ) :将恢复图像的高度。 loadfromdata (自、数据、len、格式、标志) ) :从给定二进制数据数据的第一个len字节加载带图像。 如果指定了格式格式,则以指定的格式加载。 如果未指定格式,加载器将根据相关信息推测加载格式。 save (自、文件名、格式、质量) :使用指定的图像格式格式和质量因子质量将像素图像保存到文件文件名中。 质量必须为范围[ 0,100 ]或-1。 指定0获取小压缩文件,指定100获取大非压缩文件,指定-1使用默认设置。 toimage(:将像素图像转换为QImage。 如果转换失败,则返回空图像。 q位图配置文件q位图类提供单色(1位深度)像素图像。 它主要用于创建自定义QCursor和QBrush对象、创建QRegion对象以及设置像素图像和零件的“遮罩”(mask )。 q位图的位深度为1。 空对象为0。 当您将具有大于1的位图深度的像素图像指定给位图时,组位图将自动抖动。
在QBitmap对象上绘制图像时,使用Qt.color0将位图位设置为0,使用Qt.color1将位图位设置为1。 对于位图,0位表示背景(或透明像素),1位表示前景(或不透明像素)。 使用clear ()函数将所有位设置为0。 请注意,在位图中,使用Qt.black和Qt.white颜色没有意义。 因为QColor.pixel ()的值在黑色和白色中不一定为1。
q位图常规函数:
清除clear(self ) :位图,并将所有位设置为Qt.color0。 fromdata(size:qsize、bits、format ) :静态函数创建指定大小的位图,并将该位图的内容设置为指定的bits。 fromimage(image,flag ) :静态函数。 从指定的图像image创建位图。 演示程序使用QPixmap加载图像文件,并与QPainter变换操作结合显示缩放、旋转和扭曲的图像效果。 完整的代码是以下:
importsys,osfromPyQt5importQtCore,QtGui,qtwidgetsfrompyqt5. qtcoreimportqtfrompyqt5. qtguiimportqpainter, qpixmapfrompyqt5. qtguimportqpainter qmainwindow,q构件,QMenuBar,QMenu,QAction,QGridLayout,qsizepolicy (分类管理器类型parent=none (: super (mypixmapwidget,self ) _init_ ) parent ) self.setsizepolicy ) QSizePolicy.Preferred
) + '/panda.jpg' def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing, True) #绘制边框线 painter.drawRect(self.rect()) self.setFixedSize(256, 256) if self.type == '原图': self.drawOrignal(painter) elif self.type == '缩小': self.drawZoomOut(painter) elif self.type == '放大': self.drawZoomIn(painter) elif self.type == '旋转': self.drawRotate(painter) elif self.type == '横向扭曲': self.drawShearHor(painter) elif self.type == '纵向扭曲': self.drawShearVer(painter) else: print('not supported') def drawOrignal(self, painter): painter.drawText(self.rect(), Qt.AlignBottom|Qt.AlignCenter, '原图') pix = QPixmap(self.image_filename) rect = self.rect() painter.translate((rect.width() - pix.width()) / 2, (rect.height() - pix.height()) / 2) painter.drawPixmap(0, 0, pix) def drawZoomOut(self, painter): painter.drawText(self.rect(), Qt.AlignBottom|Qt.AlignCenter, '缩小') pix = QPixmap(self.image_filename) rect = self.rect() new_w = pix.width() * 0.5 new_h = pix.height() * 0.5 pix = pix.scaled(new_w, new_h, Qt.KeepAspectRatio) painter.translate((rect.width() - new_w) / 2, (rect.height() - new_h) / 2) painter.drawPixmap(0, 0, pix) def drawZoomIn(self, painter): painter.drawText(self.rect(), Qt.AlignBottom|Qt.AlignCenter, '放大') pix = QPixmap(self.image_filename) rect = self.rect() new_w = pix.width() * 1.5 new_h = pix.height() * 1.5 pix = pix.scaled(new_w, new_h, Qt.KeepAspectRatio) painter.translate((rect.width() - new_w) / 2, (rect.height() - new_h) / 2) painter.drawPixmap(0, 0, pix) def drawRotate(self, painter): painter.drawText(self.rect(), Qt.AlignBottom|Qt.AlignCenter, '旋转') pix = QPixmap(self.image_filename) rect = self.rect() img_w = pix.width() img_h = pix.height() painter.rotate(60) painter.translate(100, -100) painter.drawPixmap(0, 0, pix) def drawShearHor(self, painter): painter.drawText(self.rect(), Qt.AlignBottom|Qt.AlignCenter, '横向扭曲') pix = QPixmap(self.image_filename) rect = self.rect() painter.translate(20, (rect.height() - pix.height()) / 2) painter.shear(0.5,0); #横向扭曲 painter.drawPixmap(0, 0, pix) def drawShearVer(self, painter): painter.drawText(self.rect(), Qt.AlignBottom|Qt.AlignCenter, '纵向扭曲 ') pix = QPixmap(self.image_filename) rect = self.rect() painter.translate((rect.width() - pix.width()) / 2, 20) painter.shear(0,0.5); #纵向扭曲 painter.drawPixmap(0, 0, pix) class DemoPixmap(QMainWindow): def __init__(self, parent=None): super(DemoPixmap, self).__init__(parent) # 设置窗口标题 self.setWindowTitle('实战 Qt for Python: QPixmap 演示') self.initUi() def initUi(self): self.initMenuBar() mainWidget = QWidget() layout = QGridLayout() lhGrad = MyPixmapWidget('原图') lvGrad = MyPixmapWidget('缩小') ldGrad = MyPixmapWidget('放大') qGradA = MyPixmapWidget('旋转') qGradB = MyPixmapWidget('横向扭曲') cGrad = MyPixmapWidget('纵向扭曲') layout.addWidget(lhGrad, 0, 0) layout.addWidget(lvGrad, 0, 1) layout.addWidget(ldGrad, 0, 2) layout.addWidget(qGradA, 1, 0) layout.addWidget(qGradB, 1, 1) layout.addWidget(cGrad, 1, 2) mainWidget.setLayout(layout) self.setCentralWidget(mainWidget) def initMenuBar(self): menuBar = self.menuBar() menuFile = menuBar.addMenu('文件(&F)') actionExit = QAction('退出(&X)', self) actionExit.triggered.connect(QApplication.instance().quit) menuFile.addAction(actionExit) if __name__ == '__main__': app = QApplication(sys.argv) window = DemoPixmap() window.show() sys.exit(app.exec())运行结果如下图:
QPixmap演示
本文知识点 Qt提供了四个用于处理图像数据的类。使用QPixmap来加载和显示图像。使用QPixmap来绘制离屏图像。保存QPixmap。QBitmap位图。前一篇: 实战PyQt5: 119-图标处理类QIcon