【QT技术应用】2D绘图(2)
编辑:落鹤生
时间:2011-02-16 14:17
点击:1468次
QPixmap QPixmap主要完成屏幕后台 (off-screen)缓冲区绘图。QPixmap对象可以使用QLabel或QAbstractButton子类 (QPushButton,QToolButton)显示,QLabel通过设置pixmap属性,QAbstractButton通过设置icon属性 来完成,
QPixmap QPixmap主要完成屏幕后台 (off-screen)缓冲区绘图。QPixmap对象可以使用QLabel或QAbstractButton子类 (QPushButton,QToolButton)显示,QLabel通过设置pixmap属性,QAbstractButton通过设置icon属性 来完成,除了使用构造函数初始化,QPixmap对象还可以使用静态函数grabWidget()和grabWindow()函数创建,并绘制指定的窗口 和窗口部件.QPixmap中的像素数据时内部的,并且由底层的窗口系统进行管理,如果要存取像素,只有通过QPrinter函数将QPixmap对戏那 个转换为QImage对象,根据底层系统的不同,QPixmap可以RGB32或者混合alpha格式存储,如果图像有Alpha通道且底层系统允许,则 优先使用混合alpha格式,因此QPixmap时依赖于底层系统的,在X11上和Mac上,QPixmap存储在服务器端,QImage存储在客户点, 在windows上,这两个类表达方式时相同的。QImage和QPixmap可以相互转换,通常QImage载入图像并进行直接操作,然后转换为 QPixmap在屏幕上显示。如果不需要操作像素,就直接使用QPixmap.在windows上,QPixmap还可以与HBITMAP之间相互转 换,QPixmap和QImage一样使用隐式共享,也能够使用数据流。 ========================================= 组合模式绘图 组 合模式(Composition Mode)用来指定如何合并源图像和一个图像,最常见的是SourceOver(通常也叫alpha混合),当原像素和目标像素以这种方式混合时,源图像 的alpha通道定义了像素的透明度。组合模式绘图只支持Format_ARGB32_Premultiplied和Format_ARGB32格格式, 而且应该优先使用Format_ARGB32_Premultiplied格式,设置了组合模式后,它对所有的绘图操作都有效,如画笔,画刷,渐变效果和 pixmap/image绘制。QPainter::CompositeMode枚举类型中前12中组合类型是T.Porter和T.Duff于1984 年在沦为(Compositing Digital Image)中阐明的12种混合规则(Porter-Duff规则)混合的计算方法在此给出。以便理解混合的过程。 首先定义混合的因子 : As: 原像素的alpha分量 Cs: 原像素种计算好(premultiplied)色彩分量 Ad: 目标像素的alpha分量 Cd; 目标像素计算好的色彩分量 Fs: 原像素在输出结果种占有的比例 Fd: 目标像素在输出结果种占有的比例 Ar: 输出结果种的Alpha分量 Cr: 输出结果种计算好的色彩分量 Porter和Duff定义了选择混合因子Fs和Fd产生不同的视觉效果的12种规则,最终结果种的Alpha值和色彩值由下面的公式决定 Fs=f(Ad); Fd=f(As); Ar=AsxFs+AdxFd Cr=CsxFs+CdxFd 每种类型的Fs和Fd取值如表所示 ------------------------------------------------------------------------------------------ 常 量 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 在目标之外的源和源之外的目标混合 -------------------------------------------------------------------------------------------------------- 注意,上面的说明并没有完全概括各种混合的含义,要准确理解他们可以看公式并进行实践,畜类上面12种Porter_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 和上一条规则的效果类似,但对比对较低一些,绘制白色将导致反转成目标颜色,绘制黑色没有
|