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
}
}
}
hola, binnyb! Ahora tienen un problema similar. ¿Me puedes ayudar? ¿Puedes mostrar tu código? Gracias! – vsvydenko