Qt之2D绘图5

QImageQPixmap绘图设备

Qt提供了4个处理图像的类。QImage,QPixmap,QBitmap,QPicure.他们有着各自的特点。QImage优化了I/O操作,可以直接存取操作像素数据。QPixmap主要用来在屏幕上显示图像。QBitmapQPixmap继承,只能表示两种颜色,QPicture是可以记录和重放QPrinter命令的类。QImage提供了与硬件无关的图像表示方法。通过QImage可以直接存取像素数据,QImage也可以用作绘图设备。

QImage支持的图像颜色可以是单色,8位,32位和alpha混合的格式。因为QImageQPainterDevice继承,所以QPainter可以直接在QImage上绘图。除了绘制文字格式外(QFont依赖于底层的GUI).其他的绘制操作可以在任意线程中完成,如果要在其他线程中绘制文字,可以使用QPainterPathQImage对象具有隐式共享,作为传值参数,可以使用数据流及进行比较等特性。

读入图像可以通过QImage构造函数,load(),loadFromData()几种方法完成。还可以通过QImage的静态函数fromData()由指定数据构造一个QImage对象。既可以从文件系统装入,也可以从Qt应用程序的嵌入式资源中读取,使用save()可以保存QImage对象。可以通过QImageReader::supportedImageFormats()QImageWriter::supportedImageFormats()获取QImage支持的所有文件格式列表。

QImage函数

几何函数size(),widt(),dotsPermeterX(),dotsPerMeterY()函数获取图像大小和比例信息。         rect()函数返回图像的包容矩形,valid()测试给定的坐标是否在此矩形内。offset()获取图像和其他图像之间的相对偏移量。setOffset()函数设置偏移量。

颜色函数   某个像素的颜色可以通过pixel函数获取,返回值是QRgb类型,对于单色和256色图像,colorTable()返回调色板,numColors返回调色板中的条目数.pixelIndex()            函数获取像素的颜色索引,然后使用color()函数取出实际的颜色值.hasAlphaChannel()函数返回图像是否使用了alpha通道。allGray(),isGrayscale()测试图像是否为灰度图像。

文字 text()函数返回图像附属的文字,textKeys()返回文字的键值表。setText()函数改变图像附属文字.

低级信息   depth()函数获取图像颜色位数.支持1,8,32.format().bytesPerLine()numBytes()函数返回图像的数据存储信息.serieralNumber()函数取得唯一标识QImage对象的数字.

QImage8位和单色图像采用颜色索引表的方式存取,32为的图像则直接存储ARGB.因此他们的像素操作函数也不相同,对32位的图像,setPixel()函数可以改变指定像素的QRgb颜色值,对8位和单色图像,setPixel()改变在预定义颜色表中的索引值,如果要改变颜色表,可以使用setColor()函数。QImage提供scanLine()函数返回指定行的数据。bits()函数返回第一个像素的指针。每个像素在QImage中都使用整数形式表示。单色图像使用一位的索引指向只有两种颜色的调色板,有两种类型的单色图像,big endia(MSB),little endian(LSB).256色图像使用8位颜色调色板,调色板的数据类型是QVector,QRgb实际上时无符号整数型,存储ARGB的格式是0xAARRGGBB.32位的图像直接存储,有三种类型的存储格式:RGB,ARGB和已预乘的ARGB。在已预乘ARGB中,红绿蓝三色已经和alpha相乘并模除255.allGray()isGrayscale()函数可以判断一个彩色图像能否安全转化为灰度图像。图像的格式用format()函数读取出,convertToFormat()可以进行图像格式转化,QImage支持的存储格式如下:

QImage::Format_Mono            单色图像(MSB)

QImage::Format_MonoLSB         单色图像(LSB)

QImage::Format_Indexed8        使用颜色表的256色图像

QImage::Format_RGB32           不支持Alpha通道的32位图像

QImage::FOrmat_ARGB32          Alpha通道的32位图像

QImage::Format_ARGB32_Premultiplied   已预乘的含Alpha通道的32位图像.

QPixmap
QPixmap主要完成屏幕后台(off-screen)缓冲区绘图。QPixmap对象可以使用QLabelQAbstractButton子类 (QPushButton,QToolButton)显示,QLabel通过设置pixmap属性,QAbstractButton通过设置icon属性 来完成,除了使用构造函数初始化,QPixmap对象还可以使用静态函数grabWidget()grabWindow()函数创建,并绘制指定的窗口 和窗口部件.QPixmap中的像素数据时内部的,并且由底层的窗口系统进行管理,如果要存取像素,只有通过QPrinter函数将QPixmap对戏那 个转换为QImage对象,根据底层系统的不同,QPixmap可以RGB32或者混合alpha格式存储,如果图像有Alpha通道且底层系统允许,则 优先使用混合alpha格式,因此QPixmap时依赖于底层系统的,在X11上和Mac上,QPixmap存储在服务器端,QImage存储在客户点, 在windows上,这两个类表达方式时相同的。QImageQPixmap可以相互转换,通常QImage载入图像并进行直接操作,然后转换为 QPixmap在屏幕上显示。如果不需要操作像素,就直接使用QPixmap.windows上,QPixmap还可以与HBITMAP之间相互转 换,QPixmapQImage一样使用隐式共享,也能够使用数据流。

组合模式绘图
组合模式(Composition Mode)用来指定如何合并源图像和一个图像,最常见的是SourceOver(通常也叫alpha混合),当原像素和目标像素以这种方式混合时,源图像 的alpha通道定义了像素的透明度。组合模式绘图只支持Format_ARGB32_PremultipliedFormat_ARGB32格格式, 而且应该优先使用Format_ARGB32_Premultiplied格式,设置了组合模式后,它对所有的绘图操作都有效,如画笔,画刷,渐变效果和 pixmap/image绘制。QPainter::CompositeMode枚举类型中前12中组合类型是T.PorterT.Duff1984 年在沦为(Compositing Digital Image)中阐明的12种混合规则(Porter-Duff规则)混合的计算方法在此给出。以便理解混合的过程。
首先定义混合的因子 :
As:       原像素的alpha分量
Cs:       原像素种计算好(premultiplied)色彩分量
Ad:       目标像素的alpha分量
Cd;       目标像素计算好的色彩分量
Fs:       原像素在输出结果种占有的比例
Fd:       目标像素在输出结果种占有的比例
Ar:       输出结果种的Alpha分量 
Cr:       输出结果种计算好的色彩分量
PorterDuff定义了选择混合因子FsFd产生不同的视觉效果的12种规则,最终结果种的Alpha值和色彩值由下面的公式决定
    Fs=f(Ad);
    Fd=f(As);
    Ar=AsxFs+AdxFd
    Cr=CsxFs+CdxFd
每种类型的FsFd取值如表所示:

   常 量                             Fs        Fd              说明
QPainter::CompositionMode_SourceOver   1  1-As   默认模式,源alpha和目标像素混合
QPainter::CompositionMode_DestinationOver       1-Ad       1          SourceOver相反,目标Alpha和源像素混合
QPainter::CompositionMode_Clear                 N/A       N/A         清除目标像素
QPainter::CompositionMode_Source          N/A       N/A         输出源像素
QPainter::CompositionMode_SourceIn          Ad        0     在目标部分的源替代目标
QPainter::CompositionMode_DestinationI          0         As    SourceIn相反
QPainter::CompositionMode_SourceOut       1-Ad      0   在目标之外的源替代目标
QPainter::CompositionMode_DestinationOut     0         1-As        SourceOut相反
Qpainter::CompositionMode_SourceAtop    Ad      1-As     在目标部分的源和目标组合
QPainter::CompositionMode_DestinationAtop   1-Ad    As    sourceatop相反
QPainter::CompositionMode_Xor      1-Ad   1-As  在目标之外的源和源之外的目标混合

注意,上面的说明并没有完全概括各种混合的含义,要准确理解他们可以看公式并进行实践,畜类上面12Porter_Duff规则外,Qt还支持12种扩展混合模式。下面给出计算公式需要注意如果结果中alpha值和色彩值超过0-255的范围,数值将会被截断

1  QPainter::CompositionMode_Plus     源和目标相加,该操作实现动画中两幅图像的溶解和过度过程。Cr=Cs+Cd   Ar=As+Ad

2  QPainter::CompositionMode_Multiply       源和目标进行正片叠底(multiply)操作。结果的颜色至少是源和目标种较暗的颜色。任何颜色和黑色作该操作产生黑色。任何颜色和白色作该操作将不会改变。

Cr=CsxCd+Csx(1-Ad)+Cdx(1-As)  Ar=AsxAd+Asx(1-Ad)+Adx(1-As)=As+Ad-AsxAd

3  QPainter::CompositionMode_Screen         源和目标互补然后相乘结果的颜色至少是源和目标种较亮的颜色。任何颜色和黑色进行滤色操作不会改变,任何颜色和白色进行滤色操作还是白色

4  QPainter::CompositionMode_Overlay        根据目标颜色值不同,进行相乘操作或滤色操作,源色彩保持亮度和阴影覆盖在目标上。目标颜色和源颜色混合以反应目标的亮度。

5  QPainter::CompositionMode_Darken         选择源和目标种较暗的颜色

6  QPainter::CompositionMode_Lighten        选择源和目标种较亮的颜色

7  QPainter::CompositoinMode_ColorDodge     加亮目标颜色以反应源颜色,绘制黑色将没有效果

8  QPainter::CompositionMode_ColorBurn      使目标颜色变暗以反应源颜色,绘制白色没有效果。

9  QPainter::CompositionMode_HardLight      根据源的颜色,决定是正片叠底还是滤色操作。如果源颜色高于0.5,目标颜色将变亮。即进行滤色操作。如果源颜色亮度值低于0.5,目标将会变暗,相当于进行了正片叠底操作。如果源亮度值等于0.5,目标不会改变,变亮或者变暗成都取决于源颜色和0.5的差,绘制纯黑色和纯白色结果还是纯黑或纯白。

10 QPainter::CompositionMode_SoftLight      根据源的颜色,决定进行变暗(darken)操作还是变亮(lighten)操作。如果源颜色比0.5亮,目标将变亮,即进行了滤色操作。如果源颜色比0.5暗,目标将变暗,相当于进行了颜色加深(burn)操作,如果等于0.5.目标不会发生改变。变亮或者变暗的程度取决于源颜色和0.5的差值。

11 QPainter::CompositionMode_Difference     源和目标种较暗的颜色减去较亮的颜色,绘制导致白色反转成目标颜色黑色没化

12 Qpainter::CompositionMode_Exclusion      和上一条规则的效果类似,但对比对较低一些,绘制白色将导致反转成目标颜色,绘制黑色没有。

转载于:https://my.oschina.net/jintao/blog/80661

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值