QML Image smooth-Eigenschaft funktioniert nicht

8

In QML habe ich eine Rectangle -Ansicht mit einer Menge von Image -Elementen erstellt. Ich kann nicht scheinen, dass die Eigenschaft smooth funktioniert, die sowohl für die Ansicht als auch für die Bilder auf true gesetzt ist. Ich habe versucht, die Bilder selbst zu skalieren und die Ansicht zu skalieren. Egal was ich mache, ich bekomme ein gezacktes skaliertes Bild. Fehle ich etwas?

Ich arbeite mit Qt 5.2 und verwende eine QtQuick2ApplicationViewer (Unterklasse von QQuickView ) als meine Hauptansicht.

Ich habe Lösungen gefunden, bei denen Glättung angewendet wird, indem ich den Bildhandler in der Engine ersetze, aber ich denke, dass die Eigenschaft smooth einfach funktionieren sollte.

Code:

%Vor%

Zweiter Versuch:

%Vor%

Dritter Versuch:

%Vor%

Ich bekomme jedes Mal das gleiche Ergebnis.

Update: Wie von Nejat vorgeschlagen, habe ich die neue Eigenschaft Qt 5 antialiasing ausprobiert. Das Ergebnis verbessert sich, aber wenn die Skalierung unter 0,5x erfolgt, werden die Kanten immer noch etwas gezackt. Gibt es eine Möglichkeit, die Antialiasing-Qualität zu ändern?

Von links nach rechts:

  • erwartete Ausgabe (skaliert mit Photoshop, unbearbeitet)
  • antialiasing und smooth aktiviert
  • nur smooth aktiviert

Ich frage mich auch, warum smooth nichts macht.

    
Robbert 25.04.2014, 07:22
quelle

3 Antworten

6

Für ein reibungsloses Downsampling benötigen Sie Mipmaps !

Mit Qt 5.3 (welches sehr bald veröffentlicht wird) wird dies funktionieren:

%Vor%

Für Qt 5.2 können Sie Folgendes als eine bessere Alternative zu Ihrem Multisampling-Ansatz versuchen:

%Vor%

Wenn Sie den Maßstab des Bildes nicht dynamisch ändern müssen, ist der optimale Ansatz (für alle relevanten Qt-Versionen):

%Vor%

Das Bild wird auf der CPU in hoher Qualität verkleinert und dann auf die GPU hochgeladen. Beachten Sie, dass Bildinformationen verloren gehen, wenn sie im Maßstab des Originalbildes angezeigt werden.

Bezüglich der Eigenschaft smooth :

Die Eigenschaft smooth eines Image ermöglicht eine lineare Interpolation. Es ist standardmäßig und es ist eine Verbesserung gegenüber Nearest-Neighbor Interpolation , die verwendet wird wenn smooth = false ; aber es hilft nicht viel beim Herunterskalieren.

Bezüglich der Eigenschaft antialising :

Durch die Einstellung von antialiasing = true wird die Qualität der Bildskalierung nicht geändert. Es glättet nur die Kanten, was wichtig sein kann, wenn das Bild gedreht wird.

    
Kay Sarraute 03.05.2014, 20:03
quelle
1

Sie sollten die Eigenschaft "antialiasing" auf "true" setzen. Es kann für jedes Element einschließlich des Canvas-Bereichs festgelegt werden. Aus der Dokumentation:

  
    

Wird hauptsächlich in Rectangle- und image-basierten Elementen verwendet, um zu entscheiden, ob     Gegenstand sollte Antialiasing oder nicht benutzen. Elemente mit aktiviertem Antialiasing     benötigt mehr Speicher und ist möglicherweise langsamer zu rendern.

  
     

Der Standardwert ist false

So kann es sein wie:

%Vor%     
Nejat 25.04.2014 11:58
quelle
0

Update: Ab Qt 5.3 löst die Eigenschaft mipmap das Problem. Die folgende Antwort gilt nur für Qt 5.2 oder älter.

Das Hinzufügen der Eigenschaft antialiasing (seit Qt 5) hat das bewirkt, was Sie von der Eigenschaft smooth erwarten würden. Danke dafür, Nejat . Wie jedoch in der aktualisierten Frage dargestellt, ist die Antialiasing-Qualität immer noch schlecht. Um dies zu lösen, definieren Sie ein benutzerdefiniertes Oberflächenformat, um eine benutzerdefinierte Antialiasing-Abtastrate festzulegen (Auszug aus main.cpp ):

%Vor%

Siehe die Dokumentation: QSurfaceFormat :: setSamples .

Viele schlagen vor, SVG anstelle von PNG zu verwenden. Meiner Erfahrung nach werden SVGs bei der Standardkonfiguration von Qt Quick in einer bestimmten Größe abgetastet und werden daher genau wie PNGs behandelt.

    
Robbert 03.05.2014 12:27
quelle

Tags und Links