2011-09-09 10 views
9

Si tengo el SDK objetivo mínimo para mi aplicación establecida en 4, todas las llamadas a Drawable.createFromStream cambian el tamaño de las imágenes.¿Cómo crear un Drawable de una secuencia sin redimensionarlo?

p. Ej. si la imagen de origen es 480px de ancho y el dispositivo Android mi aplicación se está ejecutando en tiene una densidad de 1,5 a continuación, el código siguiente devuelve un BitmapDrawable con una anchura de 320

URL url = new URL("http://www.examples.com/something.png"); 

Drawable d = Drawable.createFromStream(url.openStream(), "something.png"); 

¿Hay un método para forzarlo a ser sin cambios o especifique la escala (ldpi/mdpi/hdpi etC) para devolver una imagen de un InputStream?

Editar: Solución de abajo.

Bitmap b = BitmapFactory.decodeStream(inputStream); 
b.setDensity(Bitmap.DENSITY_NONE); 
Drawable d = new BitmapDrawable(b); 

Respuesta

8

Puede cargar la imagen como mapa de bits. De esta forma, su tamaño no cambiará.

BitmapFactory.decodeStream(...) 

O puede intentar BitmapDrawable(InputStream is) constructor. Está en desuso, pero creo que debería hacer el trabajo.

+0

Me gustaría ir con el método 'BitmapDrawable()' ya que va directo al grano. Está obsoleto, pero no para el nivel 4 de la API. Lo ideal sería usar 'BitmapDrawable (Resource, InputStream)', pero eso no estará disponible para ti hasta API nivel 5. Otra opción es hacer algo como 'BitmapDrawable (Resource, new BitmapFactory() .decodeStream (InputStream)) 'que está disponible en el nivel 4 de API (pero no menos). – DeeV

+0

Esto funciona gracias. He agregado una edición para mostrar cómo convertir a BitmapDrawable. – Johnny

1

Después de un largo tiempo, me encontré con la siguiente solución. Funciona. Recupera el mapa de bits del archivo en locallink.

private Drawable getDrawableForStore(String localLink) { 
    Bitmap thumbnail = null; 
    try { 
     File filePath = this.getFileStreamPath(localLink); 
     FileInputStream fi = new FileInputStream(filePath); 
     thumbnail = BitmapFactory.decodeStream(fi); 
    } catch (Exception ex) { 
     Log.e("getThumbnail() on internal storage", ex.getMessage()); 
     return null; 
    } 

    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    float scaledDensity = metrics.density; 
    int width = thumbnail.getWidth(); 
    int height = thumbnail.getHeight(); 

    if(scaledDensity<1){ 

     width = (int) (width *scaledDensity); 
     height = (int) (height *scaledDensity); 
    }else{ 
     width = (int) (width +width *(scaledDensity-1)); 
     height = (int) (height +height *(scaledDensity-1)); 
    } 

    thumbnail = Bitmap.createScaledBitmap(thumbnail, width, height, true); 
    Drawable d = new BitmapDrawable(getResources(),thumbnail); 

    return d; 

} 
1

Carga de imágenes de recurso local en Adaptador ImageView

me he quedado atrapado con el error OOM en iones por Koushik Dutta, por un precio tan bajo como 2 imágenes, la carga de la carpeta de recursos. Incluso mencionó que podría suceder ya que no son flujos de datos. y sugirió cargarlos como InputStream.

I tirado Biblioteca de iones porque quería solo 4 imágenes del local.

aquí está la solución con ImageView simple.

dentro de la RecyclerViewAdapter/o cualquier donde

InputStream inputStream = mContext.getResources().openRawResource(R.drawable.your_id); 

    Bitmap b = BitmapFactory.decodeStream(inputStream); 
    b.setDensity(Bitmap.DENSITY_NONE); 
    Drawable d = new BitmapDrawable(b); 
    holder.mImageView.setImageDrawable(d); 

Aunque Disponibles d = new BitmapDrawable (b); está en desuso, pero hace bastante bien el trabajo.

así que en vez podemos obtener directamente dibujable de InputStream con sólo esta línea ..

Drawable d = Drawable.createFromStream(inputStream,"src"); 

espero que ayude.

+0

tnx +1 voto para ti. –

Cuestiones relacionadas