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

  • ¿Existe un Util para convertir US State Name a State Code. p.ej. Arizona a AZ?
  • ¿Debemos usar clases anónimas para OnClickListeners o clases internas con nombre?
  • Eclipse ADT 22.6.2 todavía da el error "java.lang.NullPointerException"
  • Enviar notificación a todos los dispositivos conectados a una red Wi-Fi
  • Fragmentos método onClick en el elemento fragmento
  • Envíe archivos grandes (de vídeo) desde Android a PHP Server
  • Cajón de navegación que no muestra pero que sigue abriendo
  • Cómo crear un archivo apk en la línea de comandos?
  • Uso de funciones nativas en Android con OpenCV
  • Mantener la clave secreta SECRET - dentro de la aplicación para Android .. cualquier idea
  • GSON. Cómo convertir json objeto a json array?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.