lunes, 15 de marzo de 2010

Cambiando transparencia y color de un Bitmap


Nuestro objetivo aquí es con una sola imagen crear diferentes versiones cambiando la transparencia y el color sin tener que usar 100 imagenes.

Transparencia

Para añadir transparencia a una imagen o Bitmap, debemos hacerlo mediante el uso del objeto Paint. Quedando de la siguiente forma:
Bitmap b = BitmapFactory.decodeResource(getResources(),R.drawable.placew);
Paint mask = new Paint();
mask.setAlpha(255/10 * j);
canvas.drawBitmap(b,0,0, mask);


Con el método setAlpha podemos cambiar la transparencia desde opaco 255 a invisible 0.

Color

La tarea de cambiar el color es un tanto mas compleja.Para esto usaremos la imagen que queramos modificar con el area al que le queramos cambiar el color, de color blanco. Y cuando queramos cambiarle el color lo que haremos será recorrer la imagen pixel a pixel, y cuando el pixel sea blanco lo cambiaremos por el que queramos.


A continuación dejamos un ejemplo del código de la aplicación mostrada en la imagen donde se aplica todo lo comentado.


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}

private static class SampleView extends View {

public SampleView(Context context) {
super(context);
this.setBackgroundColor(Color.WHITE);
}

@Override
protected void onDraw(Canvas canvas) {

for (int j = 0; j < 10; j++) {
for (int i = 0; i < 10; i++) {
Bitmap b =
BitmapFactory.decodeResource(getResources(),R.drawable.placew);
Paint mask = new Paint();
mask.setAlpha(255/10 * j);
int color = Color.rgb(255 - (255/10 * i),(255/10 * i) , 0);
canvas.drawBitmap(adjust(b,color ), 0 + (b.getWidth() * j), i * b.getHeight() + 15,
mask);
}}}}

private static Bitmap adjust(Bitmap d, int color){

Bitmap src = d;
Bitmap bitmap = src.copy(Bitmap.Config.ARGB_8888, true);
for(int x = 0;x < bitmap.getWidth();x++)
for(int y = 0;y < bitmap.getHeight();y++)
if(match(bitmap.getPixel(x, y)))
bitmap.setPixel(x, y, color);
return bitmap;
}

private static boolean match(int pixel){

int[] FROM_COLOR = {255,255,255};
int THRESHOLD = 10;

return Math.abs(Color.red(pixel) - FROM_COLOR[0]) < THRESHOLD &&
Math.abs(Color.green(pixel) - FROM_COLOR[1]) < THRESHOLD &&
Math.abs(Color.blue(pixel) - FROM_COLOR[2]) < THRESHOLD;
}

No hay comentarios:

Publicar un comentario