QT更改QImage alpha

时间:2013-10-29 17:54:32

标签: qt qt4 qimage

我需要更改我所拥有的QImage的alpha值,以便它与其他QImages融合在一起。这需要快速打开和关闭。

以前我不得不重新创建每一个图像并为它们提供具有不同alpha值的新颜色。但现在我想保留相同的原始图像,而不是重绘和绘制它。

我现在正试着这样做:

QImage image;
unsigned int rgb;

for(int y=0;y<image.height();y++){
  for(int x=0;x<image.width();x++){
    rgb=image.pixel(x,y);
    image.setPixel(x,y,qRgba(qRed(rgb),qGreen(rgb),qRed(rgb),120));
  }
}

我得到了一些相当不可预测的行为。当我切换图像时,有时我会丢失颜色或不改变alpha。如果我切换回来时确实改变了alpha(我将alpha 255硬编码到其他地方而不是120),它就不会恢复正常。

这似乎不是正确的方法,不应该这么困难。看起来在图像上应该有一个函数调用来改变alpha,但我还没有找到它。

1 个答案:

答案 0 :(得分:1)

如果您使用QImage或其他QGraphicsView中的QWidget,则应查看此QGraphicsEffect

http://qt-project.org/doc/qt-4.8/qgraphicsopacityeffect.html

http://doc-snapshot.qt-project.org/4.8/qwidget.html#setGraphicsEffect

http://doc-snapshot.qt-project.org/4.8/qgraphicsitem.html#setGraphicsEffect

如果您使用的是QLabel,我会试试这个:

#include <QLabel>
#include <QPainter>

class TransparentQLabel : public QLabel
{
     Q_OBJECT
public:
     explicit TransparentQLabel() : QLabel() {}
     ~TransparentQLabel(){}
     void setOpacity(const qreal & val)
     {
          if (this->pixmap() == null || this->pixmap().isNull())
              return;
          QPixmap result(this->pixmap()->size());
          result.fill(Qt::transparent);

          QPainter painter;
          painter.begin(&result);
          painter.setOpacity(val);
          painter.drawPixmap(0, 0, *(this->pixmap()));
          painter.end();

          QLabel::setPixmap(result);
     }
};

下一位与你的问题只有一点点关系,但很高兴知道。如果您在QApplication之外进行操作系统分层,则需要执行以下操作:

 this->setWindowFlags( Qt::WindowStaysOnTopHint |
                              Qt::FramelessWindowHint | Qt::Tool);
 this->setAttribute(Qt::WA_TranslucentBackground, true);
 this->setAttribute (Qt::WA_TransparentForMouseEvents, true);

以下是这个问题的一个例子:

http://qt-project.org/wiki/QSplashScreen-Replacement-for-Semitransparent-Images

希望有所帮助。