7

4.7そしてqgraphicsviewに2つの画像をオーバーレイしたい。上の画像は、透けて見えるように半透明にする必要があります。最初、両方の画像は完全に不透明です。各ピクセルのグローバルアルファ値を設定する関数が存在することを期待していましたが、そのような関数はないようです。これに最も近いのはQPixmap::setAlphaChannel(const QPixmap&alphaChannel)ですが、Qt-4.6以降は廃止されたとマークされています。代わりに、マニュアルではQPainterのCompositionModesについて言及していますが、不透明な画像に必要な透明度を追加することに成功していません。誰かが私に実用的な例を示したり、コードを共有したりできますか?

編集: 質問をしてからほんの数時間後に、自分の答えを持って申し訳ありません。この記事から、次のコードがその役目を果たしていることがわかりました。アルファ値をピクセル単位で変更するよりも、これが「より良い」(多くの場合、より高速に変換される)と見なされるのではないかと思います。

QPainter p; 
p.begin(image);
p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.fillRect(image->rect(), QColor(0, 0, 0, 120));
p.end();            
mpGraphicsView->scene()->addPixmap(QPixmap::fromImage(image->mirrored(false,true),0));  
4

3 に答える 3

9

ペインターオブジェクトを使用して、不透明度を設定します。

void ClassName::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setOpacity(1.00);  //0.00 = 0%, 1.00 = 100% opacity.
    painter.drawPixmap(QPixmap(path));
}
于 2014-04-01T15:52:02.373 に答える
8

Qtの作曲デモは、すべてを見せびらかそうとするため、少し威圧的になる可能性があります。デモとQPainterのドキュメントがお役に立てば幸いです。CompositionMode :: SourceOverを使用して、画像がARGB32(事前乗算)に変換されていることを確認します。ドキュメントから:

When the paint device is a QImage, the image format must be set to Format_ARGB32Premultiplied or Format_ARGB32 for the composition modes to have any effect. For performance the premultiplied version is the preferred format.

于 2010-11-13T13:31:54.860 に答える
2

まず、画像の内部操作では、QPixmapへの直接アクセス機能が制限されているため、QPixmapの代わりにQImageを使用する必要があることがよくあります。理由は、QPixmapがレンダリングデバイスに保存されているためです。たとえば、Xサーバー上のpixmapやGLテクスチャなどです。一方、QPixmapからQImageに移動したり、元に戻したりすると、グラフィックカードメモリからメインメモリにコピーしたり、元に戻したりすることが多いため、コストがかかります。

私が見ているように、ブリッティングのために、ピクセルのアルファ値のみを変更し、元の値をそのままにしておく操作が必要です。エレガントではないが機能する1つの解決策は、次のとおりです。

for (int y = 0; y < image.height() ++y) {
  QRgb *row = (QRgb*)image.scanLine(y);
  for (int x = 0; x < image.width(); ++x) {
    ((unsigned char*)&row[x])[3] = alpha;
  }
}

注:QImageの各ピクセルを変更してから、painter.drawImage()対応するアルファを使用して各ピクセルを手動で描画するよりもはるかに高速です。

于 2010-11-13T14:18:56.633 に答える