• 8540阅读
  • 3回复

如何合成半透明图片 [复制链接]

上一主题 下一主题
离线novesky
 

只看楼主 倒序阅读 楼主  发表于: 2011-04-30
    有两张图片,混合成一张半透明图片。有一种方法就是对每个像素进行混合操作,不知道这个效率是否可以。现在想通过设置QPainer的CompsitionMode来实现,比如Compsition_SourceOver,看说明好像是要用source的alpha通道来混合,现在的问题是两个QImage都没有alpha通道(hasAlphaChannel()==0),应该如何设置使QImage有alpha通道?


    问题已经解决。


除了逐个像素操作外,Qt4.x还提供了其他方法。一个就是CompositionMode, 已测试成功, 但是步骤有点多。该方法需要至少一张图片带有alpha通道,所以如果没有的话第一步要加上它,找了很久只找到下面这个方法:
  
  1. QBitmap mask = src.createMaskFromColor(QColor(0,0,0,0)); //0 其他值也一样,不解
  2.     src.setMask(mask);
  3.     mask = dst.createMaskFromColor(QColor(0,0,0,255)); //255 其他值也一样,不解
  4.     dst.setMask(mask);



然后设置其中的一张图片的alpha值,这里只设被绘制的图片,参考 http://doc.trolltech.com/qq/qq17-compositionmodes.html 里的公式。
  1. /*!
  2.     DestinationOut:
  3.     The output is the destination, where the alpha is reduced by the inverse of the source.
  4.     C_dst'=C_dst*(1-a_src), a_dst'=a_dst*(1-a_src)
  5. */
  6.     p.begin(&dst);
  7.     p.setBrush(QBrush(QColor(0,0,0,_alpha_src)));
  8.     p.setCompositionMode(QPainter::CompositionMode_DestinationOut);
  9.     p.drawRect(dst.rect());



最后把另一张图绘制上去,可以使用两种模式
  1. /*!
  2.     DestinationOver: The alpha of the destination is used to blend it on top of the source pixels.
  3.     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
  4. */
  5.     p.setCompositionMode(QPainter::CompositionMode_DestinationAtop);
  6.     p.drawPixmap(dst.rect(),src);


其实QPainter还提供了一个设置不透明度的方法setOpacity(qreal),与以上方法对比,该方法步骤少,速度快,使用方便
    
  1.    p.begin(&dst);
  2.     p.setOpacity(0.5);
  3.     p.drawPixmap(dst.rect(),src);



[ 此帖被novesky在2011-05-13 20:51重新编辑 ]
离线roywillow

只看该作者 1楼 发表于: 2011-04-30
绘制的时候将QPainter的opacity设置一下呢?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线lexdene
只看该作者 2楼 发表于: 2012-10-29
QPainter必须在QWidget类或者它的子类的paintEvent函数中才能使用,
否则会由于绘图设备没有正确的初始化导致无法绘图。
离线yfx2003

只看该作者 3楼 发表于: 2012-10-31
论坛中有类似的帖子,找找看
www.qtcn.org/gpq4/
ajaxref.okajax.com/
快速回复
限100 字节
 
上一个 下一个