Aplicación de una superposición (filtro de imagen) a un mapa de bits

Estoy tratando de capturar una imagen de la intención de la cámara y luego aplicar un filtro de imagen en ella. Para elaborar la imagen sería una imagen capturada por la cámara y el filtro de imagen estaría disponible en los recursos como un archivo png. Puedo superponer el filtro encima de la imagen original. Pero, una vez superpuesta, la imagen original es 'casi' invisible (lo que significa que el filtro está siendo apilado en la imagen original y no simplemente reemplazándolo). Tengo un par de imágenes para ilustrar mi problema. La primera imagen estaba en Photoshop – cuando puse un filtro encima de una imagen, parecía estar bien. La segunda imagen es la producida por el código que se cita a continuación – se puede ver claramente que el efecto de filtro falta. ¿Alguien tiene una idea de por qué algo como esto está ocurriendo. ¿Me falta alguna lógica aquí?

Imagen filtrada - Photoshop

Imagen filtrada - por código

El siguiente es el código que tengo. Te disculpo si encuentras algunas de las mejores prácticas que faltan aquí. Inicialmente estoy tratando de probar el código:

mPictureView = (ImageView) findViewById(R.id.pictureView); filterButton = (Button) findViewById(R.id.filter_button1); // define the threshold fro scaling the image private final double SCALE_THRESHOLD = 6.0; // acquire the bitmap (photo captured) from the Camera Intent - the uri is // passed from a previous activity that accesses the camera and the current // activity is used to display the bitmap Uri imageUri = getIntent().getData(); Bitmap imageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); // set the imageView in the current activity to display the picture retrieved // from the camera mPictureView.setImageBitmap(imageBitmap); // get the dimensions of the original bitmap int photoWidth = imageBitmap.getWidth(); int photoHeight = imageBitmap.getHeight(); filterButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // set the options Options options = new BitmapFactory.Options(); options.inScaled = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; // get the image (png file) filter from resources using the options Bitmap filter = BitmapFactory.decodeResource(getResources(), R.drawable.colorful_filter,options); // create a scaled copy of the filter Bitmap filtercopy = Bitmap.createScaledBitmap(filter, (int)(photoWidth/SCALE_THRESHOLD,(int)(photoHeight/SCALE_THRESHOLD), true); // recycle the used bitmap filter.recycle(); filter = null; // get a scaled, mutable copy of the orginial image Bitmap imagecopy = Bitmap.createScaledBitmap(imageBitmap,(int)(photoWidth/SCALE_THRESHOLD), (int)(photoHeight/SCALE_THRESHOLD),true); // recycle the used bitmap imageBitmap.recycle(); imageBitmap = null; Paint paint = new Paint(); paint.setAntiAlias(true); //paint.setAlpha(230); - if a discrete value is set, then the image beneath // the filter is visible. But, I don't understand why I need to do this. // Besides, that reduces the efficacy of the filter // create a canvas with the original image as the underlying image Canvas canvas = new Canvas(imagecopy); // now, draw the filter on top of the bitmap canvas.drawBitmap(filtercopy, 0, 0, paint); // recycle the used bitmap filtercopy.recycle(); filtercopy = null; //set the filtered bitmap as the image mPictureView.setImageBitmap(imagecopy); } 

EDIT 1: Pude hacer algunos progresos con la ayuda del artículo que Joru ha proporcionado. El problema parece ser con la mezcla de los 2 mapas de bits. El método drawBitmap sólo dibujaría un mapa de bits sobre el otro en la situación que tengo. La siguiente línea de código realmente intentará mezclar los 2 mapas de bits. También he adjuntado una imagen que representa mi progreso. El mapa de bits subyacente es notablemente más visible ahora:

 paint.setXfermode(new PorterDuffXfermode(Mode.MULTIPLY)); 

Tengo que seguir jugando con él durante algún tiempo, antes de lograr la salida deseada. Filtro de color - Revisited

Usted podría intentar algunas cosas:

 Bitmap new = old.copy(Config.ARGB_8888, true); 

Para asegurarse de que el mapa de bits que está abriendo desde MediaStore está en ese formato. Si no es así, es probable que cause su problema.

  • Barra de navegación translúcida (Android 4.4) - Mostrar contenido debajo
  • Lista de clics dentro de OverlayItem (MapView para Android)
  • Cómo crear una superposición de información en Android
  • Android ViewPager: fragmentos superpuestos cuando el ancho de página se establece en 90%
  • ¿Cómo puedo dibujar una flecha que muestre la dirección de manejo en MapView?
  • Barra de herramientas Android superpuesta TabLayout en CollapsingToolbarLayout
  • Mi superposición no aparece hasta que se pulse mapView en android
  • Superponer imagen para hacer tutorial en la aplicación para Android
  • ¿Hay algún límite para dibujar la ruta usando Geocoder (Android)?
  • Cómo dibujar polígono mano libre en Google mapa V2 en Android?
  • Especifique Layout Margen superior para la barra de acción de superposición
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.