Necesito para mostrar la lista de imágenes de la api en la página de la lista. Para el que he utilizado dos enfoques.

Primer Enfoque:

Mediante la conversión de la dirección url a la matriz de bytes y, a continuación, convertir en mapa de bits.Por favor, encontrar el código de abajo..

URL imageUrl = new URL(url);
URLConnection ucon = imageUrl.openConnection();

InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

ByteArrayBuffer baf = new ByteArrayBuffer(500);
int current = 0;
while ((current = bis.read()) != -1) {
     /* This approach slowdown the process*/
     baf.append((byte) current);
}

byte[] img_ary= baf.toByteArray();

La conversión de bytes de la matriz de mapa de bits:

ByteArrayInputStream imageStream = new ByteArrayInputStream(
                    imgUrl);
Bitmap theImage = BitmapFactory.decodeStream(imageStream);

Segundo Método:

Escala de la imagen en función de la altura y la anchura de

private static final String TAG_iamge = "Image";
private static final int IO_BUFFER_SIZE = 4 * 1024;
public static Bitmap loadBitmap(String url) {
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;
try {
in = new BufferedInputStream(new URL(url).openStream(),
IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inDither = false;
options.inPurgeable = true;
options.inInputShareable = true;
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
options);
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
int reqHeight = 500;
int reqWidth = 500;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
//Calculate the largest inSampleSize value that is a power of 2
//and keeps both
//height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
int scale = inSampleSize;
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
o2.inDither = false;
o2.inPurgeable = true;
o2.inInputShareable = true;
return BitmapFactory.decodeByteArray(data, 0, data.length, o2);
} catch (Exception e) {
Log.e(TAG_iamge, "Could not load Bitmap from: " + url);
} finally {
closeStream(in);
closeStream(out);
}
return bitmap;
}
private static void copy(InputStream in, OutputStream out)
throws IOException {
byte[] b = new byte[IO_BUFFER_SIZE];
int read;
while ((read = in.read(b)) != -1) {
out.write(b, 0, read);
}
}
private static void closeStream(Closeable stream) {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
android.util.Log.e("", "Could not close stream", e);
}
}
}

Ambos enfoques hacer la APP muy lenta. Así que aquí va mi pregunta..

  1. ¿Cómo puedo convertir rápidamente la dirección en mapa de bits sin hacer la aplicación lento?
  2. Cómo las otras aplicaciones(como flipcart) visualización de la 1000>s de las imágenes, sin ningún lento o se bloquea?

    Favor de guía para obtener la respuesta.

Se le olvidó a describir lo que se hace en el segundo abordaje. Por qué?
converting the url to byte array. ?? Uno no hace esas cosas. Por favor, describa mejor lo que sucede en su lugar.
and then converting it into bitmap. Usted no está haciendo que en el primer abordaje.
Ellos usan layloading. Para que se puede usar biblioteca de terceros.
por favor revisar mi código editado

OriginalEl autor Booshan | 2015-05-15

3 Comentarios

  1. 9

    Hay una librería con nombre de Picasso. que de manera eficiente puede cargar imágenes desde una url. también puede cargar la imagen desde el Archivo. todo lo que quería hacer , de escribir una línea de código.

    ejemplo

    Picasso.with(context) //Context
    .load("http://i.imgur.com/DvpvklR.png") //URL/FILE
    .into(imageView)//an ImageView Object to show the loaded image; 

    También puede caché de su imagen, por lo que la carga de la imagen podría ser capaz de cargar más rápido la próxima vez, sin perder los datos.

    Hay muchas más opciones disponibles en Picasso. Aquí está la documentación

    Si usted necesita redondeado acorralado mapa de bits

    Picasso.with(mContext)
    .load("your-image-url-or-file-or-drawable")
    .transform(new RoundedTransformation(200, 0))
    .fit()
    .into(imageView);

    RoundedTransformation.java

    import android.graphics.Bitmap;
    import android.graphics.Bitmap.Config;
    import android.graphics.BitmapShader;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.RectF;
    import android.graphics.Shader;
    //enables hardware accelerated rounded corners
    //original idea here : http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/
    public class RoundedTransformation implements com.squareup.picasso.Transformation {
    private final int radius;
    private final int margin;  //dp
    //radius is corner radii in dp
    //margin is the board in dp
    public RoundedTransformation(final int radius, final int margin) {
    this.radius = radius;
    this.margin = margin;
    }
    @Override
    public Bitmap transform(final Bitmap source) {
    final Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
    Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(output);
    canvas.drawRoundRect(new RectF(margin, margin, source.getWidth() - margin, source.getHeight() - margin), radius, radius, paint);
    if (source != output) {
    source.recycle();
    }
    return output;
    }
    @Override
    public String key() {
    return "rounded";
    }
    }
    Hola, aquí tengo necesidad de una mayor aclaración.. quiero mostrar la imagen como una imagen redondeada de la imagen. Al principio me convierte la url en mapa de bits y, a continuación, convertir ese mapa de bits en el redondeado de mapa de bits.. ¿Cómo puedo realizar esta tarea el uso de esta biblioteca?
    Esto se puede hacer fácilmente con Picasso. espera un segundo, te voy a sacar el código.
    respuesta actualizada.
    Muchas gracias. Usted salvó mi tiempo.
    Hola me voy a implementar esta biblioteca en mi aplicación. Es esta biblioteca está más adelantado en comparación con universal-imagen-cargador?. Es este un mejor enfoque? Porque yo te voy a dar la base para nuestro proyecto.. Si es que está bien, voy a pasar.. Amablemente me guía.

    OriginalEl autor theapache64

  2. 1

    Hay librerías de código abierto que se centran en la carga de la imagen en un ImageView. Tomemos, por ejemplo, de universal-imagen-loader, es muy fácil de usar, como:

    //Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view 
    // which implements ImageAware interface)
    imageLoader.displayImage(imageUri, imageView);

    o:

    //Load image, decode it to Bitmap and return Bitmap to callback
    imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
    //Do whatever you want with Bitmap
    }
    });

    o:

    //Load image, decode it to Bitmap and return Bitmap synchronously
    Bitmap bmp = imageLoader.loadImageSync(imageUri);

    Tomar ejemplo de Volley, se puede utilizar como esto:

    public void displayImg(View view){
    ImageView imageView = (ImageView)this.findViewById(R.id.image_view);
    RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext()); 
    ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
    ImageListener listener = ImageLoader.getImageListener(imageView,R.drawable.default_image, R.drawable.default_image);
    imageLoader.get("http://developer.android.com/images/home/aw_dac.png", listener);
    //指定图片允许的最大宽度和高度
    //imageLoader.get("http://developer.android.com/images/home/aw_dac.png",listener, 200, 200);
    }

    Estas bibliotecas se utilizan ampliamente, y lo que es más importante, ellos son de código abierto. No hay necesidad de implementar funciones como esto repetidas veces.

    OriginalEl autor SilentKnight

Dejar respuesta

Please enter your comment!
Please enter your name here