Android: la qualità delle immagini ridimensionate in fase di esecuzione
Domanda
Voglio mostrare immagini utilizzando il metodo drawBitmap (). Ma prima voglio ridimensionare secondo dimensioni dello schermo. Ho un problema con la qualità dell'immagine risultato. Potete vedere le immagini e il codice di prova di seguito. Come faccio a ridimensionare le immagini in fase di esecuzione con una buona qualità?
Grazie per le soluzioni.
Immagine originale: alt text http://dl.dropbox.com/u/709109/gradient.png
screenshot dei risultati sul dispositivo: alt text http://dl.dropbox.com/u/709109/device.png
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import java.io.IOException;
import java.io.InputStream;
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout container = (LinearLayout) findViewById(R.id.container);
container.addView(new View(this) {
@Override
protected void onDraw(Canvas canvas) {
Bitmap unscaledBitmap;
try {
InputStream in = getAssets().open("images/gradient.png");
unscaledBitmap = BitmapFactory.decodeStream(in);
in.close();
canvas.drawBitmap(unscaledBitmap, null, new Rect(0, 0, 320, 480), null);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
Soluzione
Fare riferimento alla risposta di Romain di seguito.
Vorrei eliminare questa risposta, ma non riesco a dal momento che è contrassegnato come accettato.
Si noti che Android [quando questa risposta è stato originariamente scritto, senza chiedere esplicitamente a 32-bit color] sarebbe solo fare colore a 16 bit, quindi ci possono essere momenti in cui si ottiene artefatti indesiderati.
Si può anche provare a utilizzare le opzioni di dithering per dire Android per applicare automaticamente dithering che, pur non perfetto, in grado di contribuire a rendere le cose sembrano un po 'meglio.
Altri suggerimenti
Invece di ridimensionamento in tempo (che sta per essere molto costoso) elaborare, cercare di ridimensionare in un bitmap lo schermo e assicurarsi che bitmap è di 32 bit (ARGB888).
http://developer.android.com/reference /android/graphics/BitmapFactory.Options.html (da utilizzare con unscaledBitmap = BitmapFactory.decodeStream (in);
È possibile aggiungere impostazioni di qualità all'immagine. Sto indovinando che la qualità viene degradata in quanto non si passa alcuna impostazione per come l'immagine deve essere elaborata.
implementazioni del metodo createScaledBitmap (..) su piattaforme anziani (livello API <12) causano problemi quando si tenta di ridimensionare un bitmap ARGB_8888 che non ha alcun valore alfa effettivo (cioè ogni pixel ha alfa = 255), perché la loro hasAlpha flag è impostato su false. In tal caso il bitmap in scala viene automaticamente convertito nel formato RGB_565.
Di conseguenza dal livello API 12 v'è un metodo (nella classe bitmap)
setHasAlpha(boolean value);
Il che aiuta a prevenire una conversione quando si utilizzano createScaledBitmap (..).
C'è un modo per utilizzare lo stesso metodo su API di livello> 3. è presente da molto tempo, solo nascosto. Tutte le misure necessarie, tra cui il codice sorgente sono descritte qui:
https://stackoverflow.com/a/12202069/1082933
Spero che questo aiuti.
Ho avuto un problema simile e qui è quello che ho finito per fare: problemi di qualità quando ridimensionamento di un'immagine in fase di esecuzione
Inoltre, se la funzione di ridimensionamento non rispetta le proporzioni dell'immagine, la qualità viene colpito. Potete trovare alcune algoritmo di ridimensionamento sul web, ad esempio, check this out