2014-04-25 7 views
8

W języku QML utworzyłem widok Rectangle z zestawem elementów Image w nim. Nie mogę uzyskać właściwości smooth do pracy, która jest ustawiona na true zarówno dla widoku, jak i dla obrazów. Próbowałem skalować obrazy i skalować widok. Bez względu na to, co robię, dostaję postrzępiony, skalowany obraz. Czy czegoś brakuje?Właściwość wygładzania obrazu QML nie działa

Pracuję z Qt 5.2 i używam QtQuick2ApplicationViewer (podklasy QQuickView) jako mojego głównego widoku.

Znalazłem rozwiązania, w których zastosowano wygładzanie, zastępując obsługę obrazu w silniku, ale mam wrażenie, że właściwość smooth powinna po prostu działać po wyjęciu z pudełka.

Kod:

Image { 
    source: "image_400x400.png" 
    width: 400 
    height: 400 
    smooth: true 

    transform { 
     Scale {xScale: 0.25; yScale: 0.25} 
    } 
} 

Druga próba:

Image { 
    source: "image_400x400.png" 
    width: 100 
    height: 100 
    smooth: true 
} 

Trzecia próba:

Rectangle { 
    width: 400 
    height: 400 
    smooth: true 

    Image { 
     source: "image_400x400.png" 
     width: 400 
     height: 400 
     smooth: true 
    } 

    transform { 
     Scale {xScale: 0.25; yScale: 0.25} 
    } 
} 

uzyskać ten sam rezultat za każdym razem.

Aktualizacja: zgodnie z sugestią Nejata, wypróbowałem nową właściwość Qt 5 antialiasing. Wynik poprawia się, ale przy skalowaniu poniżej 0,5x krawędzie nadal są nieco poszarpane. Czy istnieje sposób na zmianę jakości wygładzania?

Od lewej do prawej:

  • oczekiwany wynik (skalowane w Photoshopie, bez edycji)
  • antialiasing i smooth włączona
  • tylko smooth włączona

Three antialiasing results with zoom

I m także nadal wygrywałem dering, dlaczego smooth nic nie robi.

Odpowiedz

6

Do płynnego próbkowania w dół potrzebny jest mipmaps!

z Qt 5.3 (który ukaże się wkrótce) to będzie działać:

Image { 
    source: "image_400x400.png" 
    width: 100 
    height: 100 
    mipmap: true 
} 

Qt 5.2 można spróbować następujących postaci wyższej jakości alternatywą dla Twojego podejścia multisampling:

ShaderEffectSource { 
    id: src 
    sourceItem: Image { source: "image_400x400.png" } 
    mipmap: true 
} 

ShaderEffect { 
    width: 100 
    height: 100 
    property var source: src 
} 

Jeśli nie trzeba zmienić skalę obrazu dynamicznie, optymalne podejście (dla wszystkich odpowiednich wersji Qt) to:

Image { 
    source: "image_400x400.png" 
    sourceSize.width: 100 
    sourceSize.height: 100 
} 

Obraz zostanie przeskalowany w wysokiej jakości na procesorze, a następnie przesłany do procesora graficznego. Należy pamiętać, że ponieważ informacje o obrazie zostaną utracone, będzie wyglądać gorzej, gdy zostanie wyświetlony w skali oryginalnego obrazu.

odniesieniu do własności smooth:

Obiekt o Imagesmooth umożliwia interpolację liniową. Domyślnie jest to i jest to poprawa w stosunku do nearest-neighbor interpolation, która jest używana, gdy smooth = false; ale nie pomaga zbytnio w zmniejszaniu skali.

odniesieniu do własności antialising:

Ustawianie antialiasing = truenie zmiana jakość skalowanie obrazu w ogóle. Po prostu wygładza krawędzie, co może być ważne podczas obracania obrazu.

+0

To jest naprawdę skomplikowane, dziękuję Kay!Teraz się z tym pogodzę - to działa, ale natychmiastowy efekt końcowy tak bardzo zmniejsza jego rozmycie, gdy zmniejszam obrazki o więcej niż 4x. Domyślam się, że pisanie niestandardowych efektów cieniowania jest następnym krokiem? Mogę po prostu trzymać się formatu powierzchni, który napisałem wcześniej, aby wszystko było proste. – Robbert

+0

Jeszcze raz dziękuję Kay, 'mipmap: true' rzeczywiście rozwiązał problem od Qt 5.3. – Robbert

+0

Dziękujemy! Spędziłem dobre piętnaście minut w porównaniu z nieruchomością "antialias" zastanawiając się, dlaczego nic nie robi ... –

1

Powinieneś ustawić właściwość "wygładzanie" na true. Można go ustawić na dowolnym elemencie, w tym na płótnie. Z dokumentacji:

stosowane głównie w prostokąt i elementy graficzne na podstawie zdecydować, czy pozycja powinny wykorzystywać antyaliasing czy nie. Elementy z włączonym wygładzaniem antyaliasingowym wymagają więcej pamięci i są potencjalnie wolniejsze w renderowaniu.

Domyślną wartością jest false

Więc może być tak:

Image { 
    source: "image_400x400.png" 
    width: 100 
    height: 100 
    smooth: true 
    antialiasing: true 
} 
+0

Dzięki Nejat! Wygląda na to, że 'antyaliasing' jest nową właściwością w Qt 5. Poprawia renderowanie, ale wynik jest nadal nieco nierówny. – Robbert

+0

Zaktualizowałem swoją odpowiedź z wynikiem Twojej sugestii. Ciągle mam wrażenie, że właściwość 'smooth' powinna coś zmienić (nadal nie działa) i powinienem jakoś ustawić jakość antyaliasingu. jakieś pomysły? – Robbert

+0

Aby obraz wyglądał dobrze podczas rozciągania, proponuję użyć obrazu svg zamiast obrazu png. – Nejat

0

Aktualizacja: jak Qt 5.3, właściwość mipmap rozwiązuje ten problem. Poniższa odpowiedź dotyczy tylko Qt 5.2 lub starszych.

Dodanie właściwości antialiasing (od Qt 5) zrobiło to, co można by oczekiwać po właściwości smooth. Dzięki za to, Nejat. Jednak, jak przedstawiono w zaktualizowanym pytaniu, jakość antyaliasingu jest nadal zła. Aby rozwiązać ten problem, należy zdefiniować niestandardowy format powierzchni ustawić częstotliwość próbkowania zwyczaj antyaliasingu (Fragment z main.cpp):

QtQuick2ApplicationViewer view; 

QSurfaceFormat format; 
format.setSamples(16); 
view.setFormat(format); 

Zobacz docs: QSurfaceFormat::setSamples.

Wiele sugeruje użycie SVG zamiast PNG. Z mojego doświadczenia wynika, że ​​przynajmniej przy domyślnej konfiguracji Qt Quick, SVG są próbkowane w pewnym rozmiarze i dlatego są traktowane dokładnie tak samo jak pliki PNG.

Powiązane problemy