2017-10-08 6 views
1

私は8x8ピクセルの4チャンネルpng画像を持っていて、それはQImageで読み込まれています。その後、QImageは200倍にスケールされるので、画像は1600x1600の新しい解像度を持ち、元の各ピクセルは200x200のサイズを持ちます。しかし、この画像がQPixmapの手段によってQLabelに加えられ、スクリーン上に示されると、描かれたピクセルはわずかに異なるサイズを有することになる。スケーリングされたQImageをペイントするときにピクセルサイズを均一にする方法は?

私はGimpでスクリーンショットを撮り、ペイントされたイメージをより詳細に観察しました。他のすべてのピクセルは、たとえば200ピクセル幅ではなく、201ピクセルよりもわずかに大きいようです。行の最後のピクセルは、補正するために小さくなるので、画像全体が最終的に正しいサイズになります。

これは、すべてのスケーリング要因を発生しない100は、例えば、微細であるので、私の元のアプローチは、場合QGraphicsViewQGraphicsPixmapItemを使用していたような256

などの2の累乗である要因は、あります私は画像の代わりにGraphicsItemを拡大/縮小しました。その効果は同じでした。

私はここでどんな効果が見られますか?そして何か、それについては何ができるのでしょうか?

この問題を再現するコードは非常に簡単です

int scale = 200; 
image = QImage("some image file"); 
QPixmap pixmap = QPixmap::fromImage(image.scaled(image.size() * scale)); 
some_label->setPixmap(pixmap); 
+1

これはあなたの問題を解決するかどうかはわかりませんが、ここに示すように、(スケーリングされていない)ピクスマップを描くときに自分でスケーリングを行うことができます:https://github.com/gerbilvis/gerbil/blob/master/gui/ widgets/scaledview.cpp#L103ここで設定したQTransformを使ってスケーリングが行われます:https://github.com/gerbilvis/gerbil/blob/master/gui/widgets/scaledview.cpp#L72(あなたのQTransformははるかに簡単です固定スケールおよび翻訳付き)Btw。これはGLレンダリングバックエンドを使用する非常に効率的な方法です。 – ypnos

+0

ありがとうございます。私はこの問題がスケーリングアルゴリズムから来るかもしれないと推測していないでしょう。私はそれが単なる絵画/プレゼンテーションの問題だと思った。しかし、私はちょうどディスクに十分な縮尺の画像を保存した、それは間違っている。ヒントをありがとう:) – ifschleife

答えて

0

は私の問題への最も簡単な解決策はQGraphicsViewQOpenGLWidgetを使用することですが判明:コンストラクタで

setViewport(new QOpenGLWidget); 

この一行ます依存関係としてOpenGLを追加するという警告が表示された画像を拡大縮小すると、精度が大幅に向上します。 このアプローチの別の問題は、setViewportを呼び出すとQGraphicsViewで行われた多くの設定が無効になることです。私の場合のように、ビューがUIファイルに設定されている場合は、setViewportの後に他のセッターを呼び出してください。

OpenGLがなくてもうまくいく優れた解決策が見つからず、もちろん私自身のラスタライザを書くことができませんでした。

関連する問題