Do czego służy parametr filtru createScaledBitmap?

210

Deklaracja android.graphics.Bitmap.createScaledBitmapIs

public static Bitmap createScaledBitmap
  (Bitmap src, int dstWidth, int dstHeight, boolean filter)

Jednak dokumentacja nie wyjaśnia żadnego z parametrów. Wszystkie z nich są dość oczywiste, z wyjątkiem boolean filter. Czy ktoś wie co to robi?

clahey
źródło

Odpowiedzi:

86

Szybkie przeglądanie kodu źródłowego SKIA wskazuje, że (przynajmniej domyślnie) flaga FILTER powoduje, że wykonuje ona prostą interpolację dwuliniową. Sprawdź Wikipedię lub ulubioną grafikę, aby zobaczyć, jakie są oczekiwane konsekwencje. Tradycyjnie podczas interpolacji obrazów należy wykonywać interpolację dwu- lub dwubiegunową, a uśrednianie obszaru - podczas zmniejszania obrazów. Odnoszę wrażenie (choć cieszę się, że mogę to poprawić), że Android / Skia wykonuje proste podpróbkowanie podczas zmniejszania rozmiaru bez filtrowania, więc prawdopodobnie uzyskasz lepsze wyniki filtrowania nawet podczas zmniejszania. (Istnieje alternatywna metoda uzyskania wysokiej jakości redukcji z interpolacją, polegająca na serii 50% redukcji skali. Zobacz http://today.java.net/pub/a/today/2007/04/03/perils-of- image-getscaledinstance.html dla szczegółów.)

pszczelarz
źródło
5
Co zrobi, jeśli przekażesz to fałszywie? Najbliższy sąsiad?
clahey,
Czy wiesz też, czy robi uśrednianie obszaru, jeśli przejdziesz filter = true?
clahey,
Powinieneś dodać obraz, aby poczuć różnicę, zamiast odwoływać się do źródeł zewnętrznych. Linki umierają, źródła znikają.
Maarten
253

Aby rozwinąć odpowiedź Karana: Zasadniczo nie zobaczysz żadnej różnicy, jeśli skalujesz obraz w dół , ale zrobisz to, jeśli skalujesz go w górę .

Przejście filter = falsespowoduje zablokowanie obrazu w pikselach.

Przechodzenie filter = truedaje gładsze krawędzie.

Jednak, jak zauważył EIYeante w komentarzach, nadal możesz zauważyć różnicę. To jest ich przykładowy obraz.

teedyay
źródło
6
@Mirko - nie, jest OK: to powinno mi teraz zasłużyć na populistyczną odznakę. :)
teedyay
@ElYeante - masz przykład? Niektóre obrazy wejściowe i wyjściowe byłyby świetne. Dzięki.
teedyay
8
@tayyay spójrz na ten przykład: dl.dropboxusercontent.com/u/18446310/… Oryginalny obraz ma rozdzielczość 1232 x 2048. Robię intensywne skalowanie donw za pomocą tego kodu: bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), intent.getData()); resizedBitmap = Bitmap.createScaledBitmap(bm, 150, 150, true); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);zmieniam tylko parametr filtru.
ElYeante
2
ta flaga wprowadza w błąd. jak możemy zmniejszyć próbkę wygładzania przed ponownym próbkowaniem, aby zapobiec wygładzaniu?
Sam
1
Link się zepsuł @teedyay
Sagar
2

Filtr ustawi FILTER_BITMAP_FLAG do malowania, co wpływa na próbkowanie bitmap po ich przekształceniu na podstawie podanej wartości.

Karan
źródło
2
Jaki to ma wpływ na próbkowanie bitmap?
clahey
Nie wiem wiele na temat próbkowania bitmap, możesz sprawdzić szczegóły na stronie wiki. en.wikipedia.org/wiki/Resampling_%28bitmap%29
Karan
„co wpływa na próbkowanie bitmap” w czym dokładnie? Czy to dobry czy zły efekt?
William Denniss,
@Willian Denniss: Sprawdź powyższy komentarz. Nie znam szczegółów i jeszcze tego nie próbowałem.
Karan
0

Trochę późno na imprezę, ale pomyślałem, że niektóre przykładowe zdjęcia mogą wyjaśnić problem.

Interfejs API Androida nie określa, jaki rodzaj filtra zostanie zastosowany, więc myślę, że pytanie brzmi: czy chcesz, aby twoje piksele pozostały takie, jakie są (tak jak byś chciał w sztuce 8-bitowej), czy też jest w porządku zastosować transformację do spraw, aby obraz był bardziej smaczny (tak jak na zdjęciach).

Istnieje bardziej ogólne pytanie, czy i jak filtrować na superużytkowniku .

Mówi Jeff Atwood:

Ogólnie rzecz biorąc, chcesz uzyskać łagodny efekt wyostrzania podczas przekształcania większego obrazu w mniejszy oraz łagodny efekt rozmycia podczas przekształcania mniejszego obrazu w większy.

porównywane filtry obrazu

Maarten
źródło