2009-12-03 151 views

回答

1
var n:Number = 1/3; 
var matrix:Array = [n,n,n,0,0, 
        n,n,n,0,0, 
        n,n,n,0,0, 
        0,0,0,1,0]; 

var cmf:ColorMatrixFilter = new ColorMatrixFilter(matrix); 
bitmap.filters = [cmf]; 
+0

不是LopSae和我的完全一样,只是它调整了光度值?为什么我不能评论LopSae的答案?非常奇怪...... 对于矩阵中的每个值所做的操作,请参阅: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/filters/ColorMatrixFilter.html – alecmce 2009-12-04 10:29:17

+0

@LopSae - 我是新的StackOverflow,还没有完全制定出所有的特质,谢谢! ;)您看到的差异可能非常微妙,取决于源图像。如果您使用的是相对明亮,大胆的颜色的测试图像,那么与具有微妙阴影的图像相比,不同的值将具有更少的可见效果... – alecmce 2009-12-05 15:16:20

+0

它的数学并不太难......对于每个像素,它将采用像素颜色的红色,绿色和蓝色分量,并将它们乘以矩阵中的第一个第二个和第三个元素(在我的例子中为1/3,在您的情况下为0.2,0.7,0.1),将它们加在一起并把这个结果作为红色值。然后,它采用与像素颜色相同的分量,并将它们乘以矩阵中的第六,第七和第八个元素,然后将它们设置为绿色。类似于第11,12和13日的蓝色。这会产生灰度,因为在结果中红色,绿色和蓝色的部分是相同的。 – alecmce 2009-12-05 15:20:14

1

在一般情况下,假设你开始与RGB图像,将其转换为HSI色彩空间,并使用我(强度)组件。

1

要将图像转换为灰度图,需要遍历图像缓冲区中的每个像素,并将R,G和B分量平均到一个实体中,然后复制三次以获得新颜色。伪代码(假设8位颜色):

for each pixel in buffer: 
    pixel.rgb = ((pixel.red + pixel.green + pixel.blue)/3) * 0x010101; 

我相信你可以用Adobe的PixelBender做些事情来达到这个目的。

+0

或者,强度有时被定义为max(R,G,B)。 – Dima 2009-12-03 23:34:09

0

应用通过该方法为DisplayObject包含您在黑色和白色想要的图像创建的滤波器:

public static function createBlackAndWhiteFilter():ColorMatrixFilter { 
    var rLum:Number = 0.2225; 
    var gLum:Number = 0.7169; 
    var bLum:Number = 0.0606; 

    var bwMatrix:Array = [rLum, gLum, bLum, 0, 0, rLum, gLum, bLum, 0, 0, rLum, gLum, bLum, 0, 0, 0, 0, 0, 1, 0]; 
    return new ColorMatrixFilter(bwMatrix); 
}//createBlackAndWhiteFilter 
+0

即使我完全不理解,我也会试试这个! 但是: 对于具体数值代表什么,为什么数组中有20个必需的值? 也许我不应该问很多,只是使用它...:-J – algro 2009-12-04 08:18:00

+0

数组中的20个值是制作一个5x4的矩阵,它实际上与alecmce在同一个问题中发布的矩阵几乎相同,只是写了它在一条线上。不同的值与我知道的每种组分颜色的不同光强度有关。所以你在不同的措施中减少每种颜色的强度,使每个颜色变成灰色阴影。 – LopSae 2009-12-05 03:06:11

+0

@alecmce:我们不能评论彼此的答案,因为我们还没有50个声望(这限制了我们只对自己的答案发表评论)。是的,大部分答案都是相同的,我刚才发现了这个答案。对于那个很抱歉。我发现真正令人困惑的是,使用矩阵与1/3,与1,我的矩阵产生完全相同的效果,没有不同的阴影,没有不同的强度......所以实际值真的很重要的东西? – LopSae 2009-12-05 03:23:32

相关问题