O que faz o parâmetro de filtro para createScaledBitmap?

210

A declaração de android.graphics.Bitmap.createScaledBitmapé

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

No entanto, a documentação não explica nenhum dos parâmetros. Todos eles são bastante óbvios, exceto boolean filter. Alguém sabe o que faz?

clahey
fonte

Respostas:

86

Uma rápida pesquisa no código-fonte SKIA indica que (pelo menos por padrão) o sinalizador FILTER faz com que faça uma interpolação bilinear direta. Verifique a Wikipedia ou sua referência gráfica favorita para ver quais são as consequências esperadas. Tradicionalmente, você deseja fazer interpolação bilinear ou bicúbica ao aumentar o tamanho de imagens e calcular a média da área ao diminuir o tamanho de imagens. Tenho a impressão (apesar de ter o prazer de ser corrigido) de que o Android / Skia faz uma subamostragem simples ao reduzir o tamanho sem filtragem, por isso é provável que você obtenha melhores resultados da filtragem, mesmo ao reduzir o tamanho. (Existe um método alternativo para obter redimensionamento de alta qualidade com interpolação, envolvendo a realização de uma série de reduções de escala de 50%. Consulte http://today.java.net/pub/a/today/2007/04/03/perils-of- image-getscaledinstance.html para detalhes.)

apicultor
fonte
5
O que ele faz se você passar falso? Vizinho mais próximo?
clahey
Além disso, você sabe se está fazendo a média da área se passar em filter = true?
clahey
Você deve adicionar uma imagem para ter uma ideia da diferença, em vez de fazer referência a fontes externas. Os links morrem, as fontes desaparecem.
Maarten
253

Para expandir a resposta de Karan: Como regra geral, você não vai ver nenhuma diferença se você está escalando sua imagem para baixo , mas você vai se você está escalando-o para cima .

A passagem filter = falseresultará em uma imagem pixelizada em bloco.

Passar filter = trueproporcionará bordas mais suaves.

No entanto, como o EIYeante apontou nos comentários, você ainda pode ver uma diferença. Esta é a imagem de exemplo deles.

teedyay
fonte
6
@ Mirko - nah, tudo bem: isso deve me dar o distintivo populista a qualquer momento. :) #
21412 # 144112
@ElYeante - você tem um exemplo? Algumas imagens de entrada e saída seriam ótimas. Obrigado.
teedyay
8
@teedyay veja este exemplo: dl.dropboxusercontent.com/u/18446310/… A imagem original possui uma resolução de 1232x2048. Estou fazendo uma escala pesada com este código: bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), intent.getData()); resizedBitmap = Bitmap.createScaledBitmap(bm, 150, 150, true); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);estou apenas alterando o parâmetro filter.
ElYeante
2
essa bandeira é enganosa. como podemos reduzir a amostragem com suavização antes da reamostragem para impedir o anti-aliasing?
Sam
1
O link quebrou @teedyay
Sagar
2

O filtro definirá o FILTER_BITMAP_FLAG para a pintura que afeta a amostragem de bitmaps quando eles são transformados com base no valor que você fornece.

Karan
fonte
2
Que efeito isso tem na amostragem de bitmaps?
24510 clahey
Não sei muito sobre amostragem de bitmap, você pode conferir a seguinte página wiki para obter detalhes. en.wikipedia.org/wiki/Resampling_%28bitmap%29
Karan
"afeta a amostragem de bitmaps" em que exatamente? É um efeito bom ou ruim?
precisa
@Willian Denniss: Verifique o comentário acima. Não conheço os detalhes e ainda não tentei.
Karan
0

Um pouco atrasado para a festa, mas achei que algumas imagens de amostra poderiam esclarecer o problema.

A API do Android não especifica que tipo de filtro seria aplicado, então acho que a pergunta é: você deseja que seus pixels permaneçam como estão (como você gostaria na arte de 8 bits) ou se pode aplicar uma transformação a torne a imagem mais agradável (como você gostaria em fotografias).

Há uma pergunta mais geral sobre se e como filtrar o superusuário .

Diz Jeff Atwood:

Em geral, você deseja um efeito de nitidez suave ao transformar uma imagem maior em uma menor e um efeito de desfoque suave ao transformar uma imagem menor em uma imagem maior.

filtros de imagem comparados

Maarten
fonte