Cosa fa il parametro di filtro per creareScaledBitmap?


210

La dichiarazione di android.graphics.Bitmap.createScaledBitmapè

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

Tuttavia, la documentazione non spiega nessuno dei parametri. Tutti sono abbastanza ovvi tranne che per boolean filter. Qualcuno sa cosa fa?

Risposte:


86

Un rapido esame del codice sorgente SKIA indica che (almeno per impostazione predefinita) il flag FILTER fa sì che esegua un'interpolazione bilineare semplice. Controlla Wikipedia o il tuo riferimento grafico preferito per vedere quali sono le conseguenze attese. Tradizionalmente, si desidera eseguire l'interpolazione bilineare o bicubica quando si ingrandiscono le immagini e si esegue la media dell'area quando si ridimensionano le immagini. Ho l'impressione (anche se sono contento di essere corretto) che Android / Skia esegua un semplice sottocampionamento durante il ridimensionamento senza filtraggio, quindi è probabile che tu ottenga risultati migliori dal filtraggio anche durante il ridimensionamento. (Esiste un metodo alternativo per ottenere ridimensionamenti di alta qualità con interpolazione, comportando una serie di riduzioni della scala del 50%. Vedi http://today.java.net/pub/a/today/2007/04/03/perils-of- image-getscaledinstance.html per dettagli.)


5
Cosa fa se lo passi falso? Il vicino più prossimo?
Clahey,

Inoltre, sai se sta facendo una media dell'area se passi filter = true?
Clahey,

Dovresti aggiungere un'immagine per avere un'idea di quale sia la differenza, invece di fare riferimento a fonti esterne. I collegamenti muoiono, le fonti svaniscono.
Maarten,

253

Per espandere sulla risposta di Karan: Come regola generale, non si vedrà alcuna differenza se si sta scalando l'immagine verso il basso , ma si avrà se si sta ridimensionarla up .

Il passaggio filter = falsesi tradurrà in un'immagine a blocchi, pixellata.

Passare filter = trueti darà bordi più lisci.

Tuttavia, come sottolineato da EIYeante nei commenti, potresti ancora notare una differenza. Questa è la loro immagine di esempio.


6
@Mirko - nah, va bene: questo dovrebbe farmi guadagnare il badge populista da un momento all'altro. :)
teedyay

@ElYeante - hai un esempio? Alcune immagini di input e output sarebbero fantastiche. Grazie.
teedyay,

8
@teedyay guarda questo esempio: dl.dropboxusercontent.com/u/18446310/… L' immagine originale ha una risoluzione di 1232x2048. Sto facendo una pesante donwscaling con questo codice: bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), intent.getData()); resizedBitmap = Bitmap.createScaledBitmap(bm, 150, 150, true); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);sto solo cambiando il parametro del filtro.
ElYeante,

2
questa bandiera è fuorviante. come possiamo sottocampionare con il livellamento prima del ricampionamento per prevenire l'antialiasing?
Sam,

1
Il collegamento si è interrotto @teedyay
Sagar il

2

Filter imposterà FILTER_BITMAP_FLAG per la pittura che influenza il campionamento delle bitmap quando vengono trasformate in base al valore fornito.


2
Che effetto ha sul campionamento delle bitmap?
Clahey,

Non so molto sul campionamento bitmap, puoi controllare la seguente pagina wiki per i dettagli. en.wikipedia.org/wiki/Resampling_%28bitmap%29
Karan

"influenza il campionamento delle bitmap" in che cosa esattamente? È un effetto positivo o negativo?
William Denniss,

@Willian Denniss: controlla il commento sopra. Non conosco i dettagli e non l'ho ancora provato.
Karan,

0

Un po 'tardi alla festa, ma ho pensato che alcune immagini di esempio potessero chiarire il problema.

L'API di Android non specifica a quale tipo di filtro verrebbe applicato, quindi suppongo che la domanda sia: vuoi che i tuoi pixel rimangano come sono (come vorresti nella grafica a 8 bit) o ​​va bene applicare una trasformazione a rendere l'immagine più appetibile (come si vorrebbe nelle fotografie).

C'è una domanda più generale su se e come filtrare su superutente .

Jeff Atwood afferma:

In generale, si desidera un lieve effetto di nitidezza quando si trasforma un'immagine più grande in un'immagine più piccola e un lieve effetto di sfocatura quando si trasforma un'immagine più piccola in un'immagine più grande.

filtri di immagine a confronto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.