实战PyQt5: 122-使用QImage实现一个看图应用
文章插图
QImage简介QImage类提供了独立于硬件的图像表示形式 , 该图像表示形式可以直接访问像素数据 , 并且可以用作绘制设备 。 QImage是QPaintDevice子类 , 因此可以使用QPainter直接在图像上绘制 。 在QImage上使用QPainter时 , 可以在当前GUI线程以外的其他线程中执行绘制 。
QImage提供了多种方式来读取图像文件 , 在创建QImage对象时可以加载图像文件 , 也可以在创建对象之后 , 使用load()或者loadFrameData()函数来加载图像 。 加载图像时 , 文件名可以是磁盘上的实际文件 , 也可以是嵌入到应用程序的资源 。
QImage类支持包括单色 , 8位 , 32位和alpha混合图像 。 QImage提供了一组函数用于获取有关图像的各种信息和实现图像转换 。
- 几何尺寸信息: 函数size(), width(), height(), dotsPerMeterX()和dotsPerMeterY()提供了图像的尺寸和纵横比信息 。 rect()函数返回图像的包围矩形 , vaild()函数用于判断一组坐标是否位于这个包围矩形内 。
- 色彩信息: 使用pixel()函数可以获得指定像素的颜色 , 该颜色是一个独立于文件格式的QRgb值 。 对于单色或者8位图像 , colorCount()和colorTable() 函数提供了有关用于存储图数据的颜色分量的信息 。 hasAlphaChannel()返回函数是否有alpha通道的信息 。
- 文本信息: text() 函数返回给定文本关键值的图像文本信息 。 函数textKeys()返回图像的文本关键值信息 。
- 底层信息: depth()函数返回图像的位深度信息 。 图像支持的深度信息把包括1(单色) , 8、16、24和32位 。 bitPlaneCount()返回图像的位平面数 。
如果是32位图像 , 则可以使用setPixel()函数为给定的像素设置一个ARGB颜色值 。 例如:
image = QImage(3, 3, QImage.Format_RGB32) value = http://kandian.youth.cn/index/qRgb(180, 149, 39)# 0xffbd9527image.setPixel(1, 1, value) value = qRgb(122, 163, 39)# 0xff7aa327image.setPixel(0, 1, value)image.setPixel(1, 0, value) value = qRgb(237, 187, 51)# 0xffedba31image.setPixel(2, 1, value)
用一个方格表示一个像素 , 上面代码生成的图像可以用下图来描述:文章插图
图片来源:doc.qt.io
对于8位和单色图像 , 像素值为图像颜色表中的索引值 , 因此setPixel()函数只能用于将给定位置的像素颜色设置为图像颜色表中的预定义的颜色值 , 即是说 , 它只能改变像素的索引值 。 若需要更改颜色或者将颜色添加到图像的颜色表中 , 可以使用setColor()函数来完成 。 颜色表中的一项为一个ARGB颜色值 , 使用qRgb()和qRgba()函数可以为setColor()提供需要的QRgb值 。 例如:
image = QImage(3, 3, QImage.Format_Indexed8) value = http://kandian.youth.cn/index/qRgb(122, 163, 39)# 0xff7aa327image.setColor(0, value) value = qRgb(237, 187, 51)# 0xffedba31image.setColor(1, value) value = qRgb(180, 149, 39)# 0xffbd9527image.setColor(2, value) image.setPixel(0, 1, 0)image.setPixel(1, 0,0)image.setPixel(1,1,2)image.setPixel(2,1,1)
用一个方格表示一个像素 , 上面代码生成的图像可以用下图来描述:文章插图
图片来源:doc.qt.io
图像格式【实战PyQt5: 122-使用QImage实现一个看图应用】QImage中存储的每个像素都由整数表示 。 整数的大小取决于格式 。 QImage支持QImage.Format枚举描述的图像格式 。 Qt提供以下图像格式:
- QImage.Format_Invalid (0): 无效图片 。
- QImage.Format_Mono (1): 每像素使用1位存储图像 。 字节首先用高位(MSB方式打包) 。
- QImage.Format_MonoLSB (2): 每像素使用1位存储图像 。 字节首先用低位(LSB方式打包) 。
- QImage.Format_Indexed8 (3): 使用8位索引将图像存储到颜色表中 。
- QImage.Format_RGB32 (4): 图像使用32位RGB格式(0xffRRGGBB)存储 。
- QImage.Format_ARGB32 (5): 图像使用32位ARGB格式(0xAARRGGBB)存储 。
- QImage.Format_ARGB32_Premultiplied (6): 使用预乘的32位ARGB格式(0xAARRGGBB)存储图像 , 即红色 , 绿色和蓝色通道乘以除以255的alpha分量 。 (如果RR , GG或BB的值大于alpha使用预乘ARGB32的某些操作(例如使用alpha混合的图像合成)要比使用普通ARGB32更快 。
- QImage.Format_RGB16 (7): 图像以16位RGB格式(5-6-5)存储 。
- Wireshark数据包分析实战:TCP报文段重组
- Python爬虫采集网易云音乐热评实战
- Django实战016:django中使用redis详解
- HTTP实战之Wireshark抓包分析
- Wireshark数据包分析实战:网卡卸载
- Python数据分析:数据可视化实战教程
- 实战经验:电商平台遭遇CC攻击,我们是如何应对的?
- Tencent IN对话 | 八位互联网实战家,实战智慧营销商学院
- HLS实战之Wireshark抓包分析
- Vue实战091:Vue项目部署到nginx服务器