2009-07-08 10 views
5

¿Cómo puedo cambiar los datos de bitmap de un mapa de bits de color a Blanco y negro en AS3? Estoy desarrollando una herramienta de edición de imágenes simple para un CMS en flash.AS3: ¿Cómo cambiar el BitmapData de un Bitmap de color a blanco y negro?

Las personas deberían poder cambiar el color del mapa de bits cargado a blanco y negro. Quiero que bitmapdata en sí cambie para poder escribirlo luego en ByteArray con JPGEncoder Class de Adobe.

Respuesta

27

esto sería la solución más elegante supongo que me (con source siendo que BitmapData):

const rc:Number = 1/3, gc:Number = 1/3, bc:Number = 1/3; 
source.applyFilter(source.bitmapData, source.bitmapData.rect, new Point(), new ColorMatrixFilter([rc, gc, bc, 0, 0,rc, gc, bc, 0, 0, rc, gc, bc, 0, 0, 0, 0, 0, 1, 0])); 

con flash.geom::Point y flash.filters::ColorMaxtrixFilter ...

ColorMatrixFilter permite muchas cosas, tales como desplazamientos de tono, colorisation, rayos, oscureciéndose y desaturación y así sucesivamente ... de lo contrario BitmapData::paletteMap y BitmapData::colorTransform son buenos complementos ...

sólo quería señalar, que el uso de la siguiente

const rc:Number = 1/3, gc:Number = 1/2, bc:Number = 1/6; 

se ve un poco más natural, ya que subjetivamente, #00FF00 es más brillante que #FF0000, que a su vez es más brillante que #0000FF

buena suerte entonces ...;)

greetz

back2dos

+0

Esta es la solución adecuada, +1. – CookieOfFortune

+3

Me parece recordar que una ponderación típica de los colores es 30%, 59% y 11% para R, G y B, respectivamente. Sin embargo, a medida que escribe la ponderación es algo subjetiva, tiene una correlación con los valores de luminancia de los colores iirc. Sus pesos están ligeramente fuera de este respecto, pero el método es absolutamente correcto. –

+0

@macke: gracias, nunca tuve los números "científicos" :) – back2dos

2

Bueno, simplemente usando getPixel y setPixel, y promediando los colores (estoy seguro de que puede haber otra manera de hacer esto con un filtro o algo así):

for(int i = 0; i < bitmapData.height; i++) 
{ 
    for(int j = 0; j < bitmapData.width; j++) 
    { 
     var color:uint = bitmapData.getPixel(i, j); 
     var red:uint = color & 0xFF0000 >> 16; 
     var green:uint = color & 0x00FF00 >> 8; 
     var blue:uint = color & 0x0000FF >> 0; 
     var bwColor:uitn = red + green + blue/3; 
     bwColor = bwColor << 16 + bwColor << 8 + bwColor; // puts the average in each channel 

     bitmapData.setPixel(i, j, bwColor); 
    } 
} 
+2

esto funcionará, pero si es posible, trate de evitar el bucle en todos los píxeles un filtro será mucho más rápido ya que son nativos. – grapefrukt

0

me trataron ambos métodos. Parece que el método ColorMatrixFilter funciona mucho más rápido cuando se trabaja con imágenes de gran tamaño.

¿Hay algún método para eliminar el filtro también? ¿o debería cambiar los valores de ColorMatrixFilter nuevamente?

+1

Creo que una vez que hayas convertido la imagen a blanco y negro no podrás volver atrás (perderás información durante la conversión). Deberá hacer una copia antes de aplicar el filtro. – CookieOfFortune

1

Gracias Cookie, Copiar el bitmapdata original fue de hecho la solución más fácil para restaurar el color.

function clearColor() { 
     colorbmd = new BitmapData(source.width, source.height); 
     colorbmd = source.clone(); 
     //apply filter here  
    } 
    function restoreColor() { 
     source = colorbmd; 
    } 

Creo que una vez que haya convertido la imagen de a blanco no se puede ir atrás y negro (Se pierde información durante la conversión ). Tendrá que hacer una copia antes de aplicar el filtro. - CookieOfFortune

0

Gracias por el enfoque, he creado una pequeña herramienta, que le permite jugar un poco con los valores: http://bjornson.inhb.de/?p=159

Los valores iniciales son los propuestos por Macke: 30%, 59 % y 11% para rgb.

También puede cargar imágenes externas y probar para obtener el mejor resultado para sus imágenes.

1

Yo uso este snipper:

//Tweens to black and white 
TweenLite.to(DisplayObjectYouWantToTween ,1,{colorMatrixFilter:{matrix:[0.3,0.59,0.11,0, 0,0.3,0.59,0.11,0,0,0.3,0.59,0.11,0,0,0,0,0,1,0]}}); 

//Tween from black and white to Color 
TweenLite.to(DisplayObjectYouWantToTween,1,{colorMatrixFilter:{matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]}}); 
2

realidad, puede utilizar back2dos la solución de una manera mucho más fácil:

const rc:Number = 1/3, gc:Number = 1/3, bc:Number = 1/3; 
mc.filters = [ new ColorMatrixFilter([rc, gc, bc, 0, 0,rc, gc, bc, 0, 0, rc, gc, bc, 0, 0, 0, 0, 0, 1, 0]) ]; 

donde CM es el contenedor de MovieClip o Sprite, donde existe la BitmapData como un elemento visual. gracias back2dos :)

Cuestiones relacionadas