Estoy tratando de aplicar filtros de mezcla en dos imágenes (en este caso, HardLight). HardLight no es compatible con la biblioteca base de Android, por lo tanto, lo hago a mano en cada píxel. La primera ejecución funciona, pero la velocidad es menos que estelar. Generar una imagen de 500x500 a partir de una imagen base de 500x500 y un filtro de 500x500 lleva demasiado tiempo. Este trozo de código se usa también para generar miniaturas (72x72), y es parte integrante del núcleo de la aplicación. Me gustaría algunos consejos y/o consejos sobre cómo acelerar esto.Optimización por fusión de píxeles en mapas de bits de Android
Si se pueden obtener grandes ganancias suponiendo que ninguna de las imágenes tendrá alfa, está bien. NOTA: BlendMode y alpha son valores no utilizados en el ejemplo (BlendMode elegirá el tipo de combinación, en este caso, hardLink HardLight).
public Bitmap blendedBitmap(Bitmap source, Bitmap layer, BlendMode blendMode, float alpha) {
Bitmap base = source.copy(Config.ARGB_8888, true);
Bitmap blend = layer.copy(Config.ARGB_8888, false);
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 = hardlight(redValueFilter, redValueSrc);
int greenValueFinal = hardlight(greenValueFilter, greenValueSrc);
int blueValueFinal = hardlight(blueValueFilter, blueValueSrc);
int pixel = Color.argb(255, redValueFinal, greenValueFinal, blueValueFinal);
buffOut.put(pixel);
}
buffOut.rewind();
base.copyPixelsFromBuffer(buffOut);
blend.recycle();
return base;
}
private int hardlight(int in1, int in2) {
float image = (float)in2;
float mask = (float)in1;
return ((int)((image < 128) ? (2 * mask * image/255):(255 - 2 * (255 - mask) * (255 - image)/255)));
}
Hola, ¿me pueden ayudar a utilizar alfa en esta función? –