2011-03-10 13 views
8

Mi aplicación tiene una función de "fotolibro" que le permite al usuario tomar una fotografía con la cámara y al mismo tiempo mostrar una imagen superpuesta en la parte superior de la cámara. Después de tomar la foto, debo guardar lo que el usuario vio mientras tomaba la foto al sistema de archivos.Guarde la superposición de imágenes con la imagen capturada por la cámara underneith

Experimenté 1 gran problema al desarrollar una solución para esto: capturar una imagen con las dimensiones compatibles en la que puedo adjuntar una imagen de superposición para que el usuario vea lo que tomó al tomar la fotografía.

Parece que no puedo capturar una imagen de la cámara con dimensiones definidas (básicamente tengo que elegir de una lista de ellas). Algunos teléfonos solo pueden producir ciertas dimensiones.

Como no puedo elegir el tamaño de la imagen capturada, parece que se me solicitará que incluya muchos tamaños diferentes de la imagen superpuesta, y ato la mejor coincidencia a la imagen capturada. No puedo simplemente colocar una vieja superposición en la parte superior de la imagen de la cámara y hacer que se vea bien.

Preguntas:

  • ¿Estoy complicar esta "imagen de la cámara + superposición de imágenes creación" proceso?
  • ¿Qué sugerencias tiene para completar esta tarea sin la necesidad de incluir varias imágenes de superposición de diferentes tamaños?

Editar: Aquí está mi solución (breve). Tenga en cuenta que esta no es una forma perfecta y quizás la forma más eficiente de hacerlo, pero funciona. Algunas cosas pueden ser innecesarias/redundantes, ¡pero lo que sea!

Notas:

  • esto no funciona demasiado bien en dispositivos de tableta.
  • la imagen de superposición debe ser girado para estar en modo horizontal (a pesar de que va a tomar la imagen sostener el teléfono en vertical)
  • tamaño de superposición es 480x320
  • necesita forzar la actividad a modo de paisaje mientras tomar la fotografía (ahora la superposición se parece a su retrato!)
  • i añadir la vista de imagen de superposición usando addContentView(overlayImageView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

...

final Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     Bitmap mutableBitmap = null; 
     try { 
        //for a PORTRAIT overlay and taking the image holding the phone in PORTRAIT mode 
      mutableBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options).copy(Bitmap.Config.RGB_565, true); 
      Matrix matrix = new Matrix(); 
      int width = mutableBitmap.getWidth(); 
      int height = mutableBitmap.getHeight(); 
      int newWidth = overlayImage.getDrawable().getBounds().width(); 
      int newHeight = overlayImage.getDrawable().getBounds().height(); 
      float scaleWidth = ((float) newWidth)/width; 
      float scaleHeight = ((float) newHeight)/height; 
      matrix.postScale(scaleWidth, scaleHeight); 
      matrix.postRotate(90); 

      Bitmap resizedBitmap = Bitmap.createBitmap(mutableBitmap, 0, 0, mutableBitmap.getWidth(), mutableBitmap.getHeight(), matrix, true); 
      finalBitmap = resizedBitmap.copy(Bitmap.Config.RGB_565, true); 
      Canvas canvas = new Canvas(finalBitmap); 

      Bitmap overlayBitmap = BitmapFactory.decodeResource(getResources(), overlay); 
      matrix = new Matrix(); 
      matrix.postRotate(90); 
      Bitmap resizedOverlay = Bitmap.createBitmap(overlayBitmap, 0, 0, overlayBitmap.getWidth(), overlayBitmap.getHeight(), matrix, true); 
      canvas.drawBitmap(resizedOverlay, 0, 0, new Paint()); 
      canvas.scale(50, 0); 
      canvas.save(); 
      //finalBitmap is the image with the overlay on it 
     } 
     catch(OutOfMemoryError e) { 
      //fail 
     } 
    } 
} 
+0

hola, binnyb! Ahora tienen un problema similar. ¿Me puedes ayudar? ¿Puedes mostrar tu código? Gracias! – vsvydenko

Respuesta

1

Creo que se trata de cómo manipular sus superposiciones. Puede recortarlo de acuerdo con el tamaño de la imagen capturada y cambiar su tamaño para ajustarlo, conservando su proporción. Puede colocar la superposición, comparando su relación con la relación de fondo, a su posición óptima.

Mantendría las superposiciones lo suficientemente grandes, con un borde ancho (sangrado), para ajustarlas fácilmente a una imagen utilizando filtros para dibujar con buena calidad. Supongo que las superposiciones son algo que diseñarías y tendrías partes transparentes, como una imagen de un payaso sin rostro para que el usuario pueda encajar en ella a alguien más.

+0

sí, la imagen de superposición puede ser algo así como "apunte la cámara para que la cabeza del objetivo esté donde debe estar la cabeza del payaso" – binnyb

+0

En ese caso, las superposiciones deben tener suficiente "sangrado" para que pueda recortarlas fácilmente. También deberá ajustar sus fórmulas a diferentes orientaciones. – Lumis

+0

arg ... ¡esto es un dolor! actualizaré la respuesta aceptada de esta publicación una vez que haya completado esta tarea. Estoy aquí constantemente para que pueda obtener crédito a su debido tiempo. – binnyb

Cuestiones relacionadas