Me estoy golpeando la cabeza contra una pared aquí, y estoy bastante seguro de que estoy haciendo algo estúpido, por lo que es hora de hacer pública mi estupidez.Mezclar píxeles de Dos mapas de bits
Estoy tratando de tomar dos imágenes, mezclarlas en una tercera imagen usando algoritmos de mezcla estándar (luz fuerte, luz suave, superposición, multiplicar, etc.).
Como Android no tiene esas propiedades de mezcla incorporadas, he ido por el camino de tomar cada píxel y combinarlos usando un algoritmo. Sin embargo, los resultados son basura. A continuación se muestran los resultados de una mezcla simple y múltiple (imágenes utilizadas y resultado esperado).
BASE:
BLEND: RESULTADO
ESPERADO:
BASURA RESULTADO:
sería apreciada Cualquier ayuda. A continuación está el código, que he tratado de eliminar toda la "basura", pero algunos pueden haberlo superado. Lo limpiaré si algo no está claro.
ImageView imageView = (ImageView) findViewById(R.id.ImageView01);
Bitmap base = BitmapFactory.decodeResource(getResources(), R.drawable.base);
Bitmap result = base.copy(Bitmap.Config.RGB_565, true);
Bitmap blend = BitmapFactory.decodeResource(getResources(), R.drawable.blend);
IntBuffer buffBase = IntBuffer.allocate(base.getWidth() * base.getHeight());
base.copyPixelsToBuffer(buffBase);
buffBase.rewind();
IntBuffer buffBlend = IntBuffer.allocate(blend.getWidth() * blend.getHeight());
blend.copyPixelsToBuffer(buffBlend);
buffBlend.rewind();
IntBuffer buffOut = IntBuffer.allocate(base.getWidth() * base.getHeight());
buffOut.rewind();
while (buffOut.position() < buffOut.limit()) {
int filterInt = buffBlend.get();
int srcInt = buffBase.get();
int redValueFilter = Color.red(filterInt);
int greenValueFilter = Color.green(filterInt);
int blueValueFilter = Color.blue(filterInt);
int redValueSrc = Color.red(srcInt);
int greenValueSrc = Color.green(srcInt);
int blueValueSrc = Color.blue(srcInt);
int redValueFinal = multiply(redValueFilter, redValueSrc);
int greenValueFinal = multiply(greenValueFilter, greenValueSrc);
int blueValueFinal = multiply(blueValueFilter, blueValueSrc);
int pixel = Color.argb(255, redValueFinal, greenValueFinal, blueValueFinal);
buffOut.put(pixel);
}
buffOut.rewind();
result.copyPixelsFromBuffer(buffOut);
BitmapDrawable drawable = new BitmapDrawable(getResources(), result);
imageView.setImageDrawable(drawable);
}
int multiply(int in1, int in2) {
return in1 * in2/255;
}
Kevin, gracias por la ayuda. No utilizo imágenes con transparencia, por lo que la opacidad siempre será 1. He actualizado el ejemplo con imágenes y he limpiado el código. – MarkPowell
Hmm gracias por las imágenes, realmente es un resultado de basura. No tengo acceso a un entorno de desarrollo de Android en este momento, pero me pregunto si no tiene algo que ver con la densidad de píxeles de los mapas de bits: parece que tus mapas de bits están usando el espacio de color RGB565, pero parece de los documentos que Color funciona en el espacio ARGB4444. No he analizado todos los documentos de mapa de bits/color para ver cómo/si esta conversión se maneja automáticamente, pero podría valer la pena revisarla hasta que pueda hacer algunas pruebas en la plataforma real. –
Muy bien, jugué un poco y pude reproducir su resultado de "basura", y lo hice funcionar de dos maneras diferentes.Trataré de cambiar mi respuesta original para reflejar esto. –