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:
antialiasing
und smooth
aktiviert smooth
aktiviert
Ich frage mich auch, warum smooth
nichts macht.
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.
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% 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
):
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.
Tags und Links qt qml antialiasing