1

我需要更改我拥有的 QImage 的 alpha 值,以便它与后面和前面的其他 QImage 混合。这需要快速打开和关闭。

以前我不得不重新创建每一个图像,并用不同的 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,但我还没有找到。

4

1 回答 1

1

如果您使用的是QImageinQGraphicsView或 in some other 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

希望有帮助。

于 2013-10-29T19:26:33.377 回答