1

私が持っている QImage のアルファを変更する必要があるので、その後ろと前の他の QImage とブレンドします。これは、オンとオフをすばやく切り替える必要があります。

以前は、すべての画像を再作成し、異なるアルファ値で新しい色を与える必要がありました。しかし今は、再描画してペイントするのではなく、同じ元のイメージを保持したいと考えています。

私は今、このようにしようとしています:

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));
  }
}

かなり予測不能な動作をしています。画像を切り替えると、色が失われたり、アルファが変更されないことがあります。また、元に戻すときにアルファが変更された場合 (アルファ 255 を 120 ではなく別の場所にハードコーディングした場合)、通常の状態には戻りません。

とにかく、これはこれを行う正しい方法のようには思えませんが、それほど難しいことではありません。アルファを変更するには、画像に対して単一の関数呼び出しが必要なようですが、まだ見つかりません。

4

1 に答える 1

1

QImageinQGraphicsViewまたは inを使用している場合は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 に答える