有两张
图片,混合成一张半透明图片。有一种方法就是对每个像素进行混合操作,不知道这个效率是否可以。现在想通过设置QPainer的CompsitionMode来实现,比如Compsition_SourceOver,看说明好像是要用source的alpha通道来混合,现在的
问题是两个
QImage都没有alpha通道(hasAlphaChannel()==0),应该如何设置使QImage有alpha通道?
问题已经解决。
除了逐个像素操作外,Qt4.x还提供了
其他方法。一个就是CompositionMode, 已测试成功, 但是步骤有点多。该方法需要至少一张图片带有alpha通道,所以如果
没有的话第一步要加上它,找了很久只找到下面这个方法:
- QBitmap mask = src.createMaskFromColor(QColor(0,0,0,0)); //0 其他值也一样,不解
- src.setMask(mask);
- mask = dst.createMaskFromColor(QColor(0,0,0,255)); //255 其他值也一样,不解
- dst.setMask(mask);
然后设置其中的一张图片的alpha值,这里只设被绘制的图片,参考
http://doc.trolltech.com/qq/qq17-compositionmodes.html 里的公式。
- /*!
- DestinationOut:
- The output is the destination, where the alpha is reduced by the inverse of the source.
- C_dst'=C_dst*(1-a_src), a_dst'=a_dst*(1-a_src)
- */
- p.begin(&dst);
- p.setBrush(QBrush(QColor(0,0,0,_alpha_src)));
- p.setCompositionMode(QPainter::CompositionMode_DestinationOut);
- p.drawRect(dst.rect());
最后把另一张图绘制上去,可以使用两种模式
- /*!
- DestinationOver: The alpha of the destination is used to blend it on top of the source pixels.
- DestinationAtop: The destination pixel is blended on top of the source, with the alpha of the destination pixel is reduced by the alpha of the destination pixel
- */
- p.setCompositionMode(QPainter::CompositionMode_DestinationAtop);
- p.drawPixmap(dst.rect(),src);
其实
QPainter还提供了一个设置不透明度的方法setOpacity(qreal),与以上方法对比,该方法步骤少,速度快,使用方便
- p.begin(&dst);
- p.setOpacity(0.5);
- p.drawPixmap(dst.rect(),src);
[ 此帖被novesky在2011-05-13 20:51重新编辑 ]