Convertir url de imagen en mapa de bits rápidamente

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

Primer enfoque:
Al convertir la url a matriz de bytes y luego convertirlo en bitmap.Por favor, busque el código a continuación ..

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(); 

Conversión de matriz de bytes en mapa de bits:

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

Segundo Enfoque:
Escalado de imagen basado en altura y ancho

 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 hacen que la APP sea muy lenta. Así que aquí están mis preguntas ..

  1. ¿Cómo puedo convertir rápidamente la url en mapa de bits sin hacer la aplicación lenta?
  2. ¿Cómo las otras aplicaciones (como flipcart) que muestran los 1000> s de imágenes, sin ningún lento o colgar?

    Por favor guíe para obtener la respuesta.

Hay una biblioteca llamada Picasso. que puede cargar imágenes de url de manera eficiente. también puede cargar la imagen desde el archivo. todo lo que quería hacer, 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 almacenar en caché su imagen, por lo que la imagen cargada podría ser capaz de cargar más rápido en la próxima vez sin perder los datos.

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

Si necesita mapa de bits acodado y redondeado

  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"; } } 

Prueba esto

Espero que esto te ayude.

Existen bibliotecas de código abierto que se centran en cargar imágenes en un ImageView . Tomemos por ejemplo de universal-image-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); 

Tomemos ejemplo de Volley , puedes usarlo así:

 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, son de código abierto. No es necesario implementar funciones como esta repetidamente.

  • ¿Cuál es el tamaño óptimo de bitmap para las carpetas ldpi / mdpi / hdpi / xhdpi extraíbles?
  • Cómo guardar una imagen transparente en Android usando ALPHA_8
  • Android: reduce el tamaño del archivo de imagen
  • Cómo tomar una captura de pantalla de SurfaceView con una vista previa de la cámara
  • Descarga asíncrona de mapas de bits en un adaptador, con énfasis en Bitmap.recycle ()
  • Android: Cómo obtener el ancho de escala de bitmap en onDraw ()
  • Android rotar mapa de bits sin hacer una copia
  • ¿Cómo posiciono mi mapa de bits en el lienzo usando una matriz?
  • Android: cómo convertir todo ImageView a Bitmap?
  • Uso de recursos extraíbles
  • Imagen sobre otra imagen Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.