如何將位圖數據的彩色位圖更改爲黑白AS3? 我正在爲Flash中的CMS開發一個簡單的圖像編輯器工具。AS3:如何將彩色位圖的BitmapData更改爲黑色和白色?
人們應該能夠將上傳的位圖的顏色切換爲黑色和白色。 我想要bitmapdata本身改變因此,我可以用Adobe的JPGEncoder Class將它寫入ByteArray。
如何將位圖數據的彩色位圖更改爲黑白AS3? 我正在爲Flash中的CMS開發一個簡單的圖像編輯器工具。AS3:如何將彩色位圖的BitmapData更改爲黑色和白色?
人們應該能夠將上傳的位圖的顏色切換爲黑色和白色。 我想要bitmapdata本身改變因此,我可以用Adobe的JPGEncoder Class將它寫入ByteArray。
這將是最完美的解決方案我猜想(與source
是你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]));
與flash.geom::Point
和flash.filters::ColorMaxtrixFilter
...
ColorMatrixFilter
允許許多東西,比如色調變化,colorisation,閃電,變黑和飽和度等...否則BitmapData::paletteMap
和BitmapData::colorTransform
是很好的補充...
只是想注意,使用以下
const rc:Number = 1/3, gc:Number = 1/2, bc:Number = 1/6;
看上去多了幾分自然的,因爲主觀上,#00FF00
比#FF0000
亮,這又是亮度比#0000FF
好運氣,然後...;)
格爾茨
back2dos
好了,只是用getPixel和setPixel和平均的顏色(我敢肯定,有可能是另一種方式與過濾器或東西要做到這一點):
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);
}
}
這將工作,但如果可能,儘量避免循環所有的像素過濾器會更快,因爲它們是本地的。 – grapefrukt 2009-07-09 06:26:47
我嘗試這兩種方法。 似乎ColorMatrixFilter方法在處理大圖像時運行速度更快。
是否有一些方法可以刪除過濾器呢?或者我應該再次更改ColorMatrixFilter值?
謝謝Cookie, 複製原始位圖數據確實是恢復顏色的最簡單解決方案。
function clearColor() {
colorbmd = new BitmapData(source.width, source.height);
colorbmd = source.clone();
//apply filter here
}
function restoreColor() {
source = colorbmd;
}
我認爲一旦你轉換的 圖像爲黑白,你不能去 回來(你失去 轉換過程中的信息)。在應用過濾器之前,您必須先製作 副本。 - CookieOfFortune
謝謝你的方法,我創建了一個小工具,可以讓你的價值觀玩: http://bjornson.inhb.de/?p=159
的初始值是由MACKE提出的:30%,59 %和11%爲rgb。
您還可以加載外部圖像並嘗試獲得最佳圖像效果。
我用這個剪斷:
//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]}});
實際上,你可以使用back2dos的解決方案在一個更簡單的方法:
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]) ];
其中MC均是MovieClip或Sprite容器,其中的BitmapData存在作爲視覺元素。 謝謝back2dos :)
這是正確的解決方案,+1。 – CookieOfFortune 2009-07-08 21:42:01
我似乎記得,對於R,G和B,顏色的典型權重分別是30%,59%和11%。雖然,如你所寫,權重有些主觀,但它與顏色iirc的亮度值確實有關聯。在這方面你的體重略有偏差,但方法是絕對正確的。 – 2010-05-04 08:05:21