Dibuja parte de la imagen a la pantalla (sin cargar todo a la memoria)

Lo que quiero hacer, es dibujar un recorte de una imagen a la pantalla, en la posición de mi elección.

Puedo fácilmente cargar esto en un mapa de bits. Y luego dibujar una subsección.

Pero cuando la imagen es grande, esto obviamente agotará la memoria.

Mi pantalla es una vista de superficie. También tiene un lienzo, etc.

Entonces, ¿cómo puedo dibujar parte de una imagen, con un offset dado, y cambiar el tamaño. Sin cargar el original a la memoria

He encontrado una respuesta que miraba a lo largo de las líneas correctas, pero no funciona correctamente. Con el uso de drawables de archivo. Código intento abajo. Aparte de los redimensionamientos al azar que produce, también es incompleta.

Ejemplo:

Ejemplo

Drawable img = Drawable.createFromPath(Files.SDCARD + image.rasterName); int drawWidth = (int) (image.GetOSXWidth()/(maxX - minX)) * m_canvas.getWidth(); int drawHeight = (int)(image.GetOSYHeight()/(maxY - minY)) * m_canvas.getHeight(); // Calculate what part of image I need... img.setBounds(0, 0, drawWidth, drawHeight); // apply canvas matrix to move before draw...? img.draw(m_canvas); 

BitmapRegionDecoder se puede utilizar para cargar una región especificada de una imagen. Este es un ejemplo de método que establece el mapa de bits en dos ImageView . La primera es la imagen completa, el envío es sólo una región de la imagen completa:

 private void configureImageViews() { String path = externalDirectory() + File.separatorChar + "sushi_plate_tokyo_20091119.png"; ImageView fullImageView = (ImageView) findViewById(R.id.fullImageView); ImageView bitmapRegionImageView = (ImageView) findViewById(R.id.bitmapRegionImageView); Bitmap fullBitmap = null; Bitmap regionBitmap = null; try { BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder .newInstance(path, false); // Get the width and height of the full image int fullWidth = bitmapRegionDecoder.getWidth(); int fullHeight = bitmapRegionDecoder.getHeight(); // Get a bitmap of the entire image (full plate of sushi) Rect fullRect = new Rect(0, 0, fullWidth, fullHeight); fullBitmap = bitmapRegionDecoder.decodeRegion(fullRect, null); // Get a bitmap of a region only (eel only) Rect regionRect = new Rect(275, 545, 965, 1025); regionBitmap = bitmapRegionDecoder.decodeRegion(regionRect, null); } catch (IOException e) { // Handle IOException as appropriate e.printStackTrace(); } fullImageView.setImageBitmap(fullBitmap); bitmapRegionImageView.setImageBitmap(regionBitmap); } // Get the external storage directory public static String externalDirectory() { File file = Environment.getExternalStorageDirectory(); return file.getAbsolutePath(); } 

Resultado es la imagen completa (arriba) y sólo una región de la imagen (abajo):

Introduzca aquí la descripción de la imagen

  • Qué es stringentity en android y su uso
  • Enviar archivos multiparte con retrofit: 2.0.0-beta1
  • ¿Debo hacer java objetos nulos?
  • Cómo utilizar Runnable.wait () en AsyncTask? ¿Por qué el AsyncTask NO espera ...?
  • Android: Inicie una actividad inmediatamente y luego cargue el contenido
  • Programación en la tableta Android
  • ¿Cómo solucionar este error en Android? Java.net.MalformedURLException: Protocolo no encontrado:
  • La actividad continúa reiniciándose cuando cambia la orientación
  • Android: centra el título de la barra de herramientas
  • Acceso a bases de datos en Android
  • Cómo obtener la altura en píxeles de LinearLayout con layout_weight
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.