Was macht der Filterparameter für createScaledBitmap?

210

Die Erklärung von android.graphics.Bitmap.createScaledBitmapist

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

In der Dokumentation werden jedoch keine der Parameter erläutert. Alle außer ihnen sind ziemlich offensichtlich boolean filter. Weiß jemand was es tut?

clahey
quelle

Antworten:

86

Ein kurzer Blick in den SKIA-Quellcode zeigt an, dass (zumindest standardmäßig) das FILTER-Flag eine einfache bilineare Interpolation bewirkt. Überprüfen Sie Wikipedia oder Ihre Lieblingsgrafikreferenz, um die erwarteten Konsequenzen zu sehen. Traditionell möchten Sie beim Vergrößern von Bildern eine bilineare oder bikubische Interpolation und beim Verkleinern von Bildern eine Flächenmittelung durchführen. Ich habe den Eindruck (obwohl ich froh bin, korrigiert zu werden), dass Android / Skia beim Downsizing ohne Filterung ein einfaches Subsampling durchführt, sodass Sie wahrscheinlich auch beim Downsizing bessere Ergebnisse beim Filtern erzielen. (Es gibt eine alternative Methode, um mit Interpolation eine qualitativ hochwertige Verkleinerung zu erzielen, bei der eine Reihe von 50% -Skalenreduzierungen durchgeführt werden. Siehe http://today.java.net/pub/a/today/2007/04/03/perils-of- image-getscaledinstance.html für Details.)

Imker
quelle
5
Was macht es, wenn Sie es falsch übergeben? Unmittelbarer Nachbar?
Clahey
Wissen Sie auch, ob eine Flächenmittelung durchgeführt wird, wenn Sie filter = true übergeben?
Clahey
Sie sollten ein Bild hinzufügen, um ein Gefühl für den Unterschied zu bekommen, anstatt auf externe Quellen zu verweisen. Links sterben, Quellen verschwinden.
Maarten
253

Zur Erweiterung auf Karan Antwort: In der Regel werden Sie keinen Unterschied sehen , wenn Sie Ihr Bild sind die Skalierung nach unten , aber Sie werden , wenn Sie es sind die Skalierung nach oben .

Das Übergeben filter = falseführt zu einem blockartigen, pixeligen Bild.

Durch filter = truedas Passieren erhalten Sie glattere Kanten.

Wie EIYeante in den Kommentaren hervorhob, sehen Sie möglicherweise immer noch einen Unterschied. Dies ist ihr Beispielbild.

teedyay
quelle
6
@Mirko - nein, es ist in Ordnung: das sollte mir jetzt jeden Moment das populistische Abzeichen einbringen. :)
teedyay
@ ElYeante - hast du ein Beispiel? Einige Eingabe- und Ausgabebilder wären großartig. Vielen Dank.
teedyay
8
@teedyay Schauen Sie sich dieses Beispiel an: dl.dropboxusercontent.com/u/18446310/… Das Originalbild hat eine Auflösung von 1232 x 2048. Mit diesem Code bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), intent.getData()); resizedBitmap = Bitmap.createScaledBitmap(bm, 150, 150, true); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);mache ich eine starke Skalierung: Ich ändere nur den Filterparameter.
ElYeante
2
Diese Flagge ist irreführend. Wie können wir vor dem erneuten Abtasten ein Downsampling durchführen, um ein Anti-Aliasing zu verhindern?
Sam
1
Der Link hat @teedyay
Sagar
2

Filter legt die FILTER_BITMAP_FLAG für das Malen fest, die sich auf die Abtastung von Bitmaps auswirkt, wenn diese basierend auf dem von Ihnen angegebenen Wert transformiert werden.

Karan
quelle
2
Welche Auswirkung hat es auf das Abtasten von Bitmaps?
Clahey
Ich weiß nicht viel über Bitmap-Sampling. Weitere Informationen finden Sie auf der folgenden Wiki-Seite. en.wikipedia.org/wiki/Resampling_%28bitmap%29
Karan
"beeinflusst das Abtasten von Bitmaps" in was genau? Ist es ein guter oder ein schlechter Effekt?
William Denniss
@ William Denniss: Überprüfen Sie den obigen Kommentar. Ich kenne die Details nicht und habe es noch nicht versucht.
Karan
0

Ein bisschen spät zur Party, aber ich dachte, einige Beispielbilder könnten das Problem klären.

Die Android-API gibt nicht an, welche Art von Filter angewendet werden soll. Ich denke, die Frage ist: Möchten Sie, dass Ihre Pixel so bleiben, wie sie sind (wie Sie es in 8-Bit-Grafiken möchten), oder ist es in Ordnung, eine Transformation anzuwenden Machen Sie das Bild schmackhafter (wie Sie es auf Fotos wünschen würden).

Es gibt eine allgemeinere Frage, ob und wie nach Superuser gefiltert werden soll .

Jeff Atwood sagt:

Im Allgemeinen möchten Sie einen milden Schärfeeffekt, wenn Sie aus einem größeren Bild ein kleineres machen, und einen milden Unschärfeeffekt, wenn Sie aus einem kleineren Bild ein größeres machen.

Bildfilter verglichen

Maarten
quelle