Раскраска серого изображения as3 - PullRequest
2 голосов
/ 02 мая 2011

Мне нужно динамически раскрасить растровое изображение градиента серого с помощью ActionScript 3.0. Градиент изменяется от белого до черного, самый темный цвет должен быть 0xFF0000, самый светлый 0xFFFFFF. Пробовал paletteMap и ColorMatrixFilter со смешанным результатом и без стабильного решения.

Ответы [ 3 ]

2 голосов
/ 03 мая 2011
        var color:uint = 0xFF0000;
        var r:uint = (color >> 16) & 0xFF;
        var g:uint = (color >> 8) & 0xFF;
        var b:uint = color & 0xFF;

        var n:Number = 1/3;

        var matrix:Array = new Array();
        matrix = matrix.concat([n,n,n,0,r]);
        matrix = matrix.concat([n,n,n,0,g]);
        matrix = matrix.concat([n,n,n,0,b]);
        matrix = matrix.concat([0,0,0,1,0]);

        _bitmapData.applyFilter(_bitmapData, _bitmapData.rect, new Point(),  new ColorMatrixFilter(matrix));'
1 голос
/ 03 мая 2011

Вместо использования ColorMatrixFilter (описанного в другом ответе) вы также можете использовать опцию blendMode = "luminosity" .

У меня есть запись в блоге об изображениях в градациях серого в ActionScriptэто может помочь: http://flexdevtips.blogspot.com/2011/01/grayscale-images-progressbar-rating.html

1 голос
/ 03 мая 2011

Очень возможно сделать с ColorMatrixFilter, построив матрицу со смещением 255 на красном канале (но в противном случае это единичная матрица).

В этом примере класса Document предполагается, что библиотека FLA имеет экспортированный символ 720 x 480 «GradientBMD», который является подклассом flash.display.BitmapData:

package
{
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.geom.Point;
    import flash.filters.*;

    public class GreyscaleDemo extends Sprite
    {
        public function GreyscaleDemo()
        {
            var bmd:BitmapData = new GradientBMD(720,480);

            var matrix:Array = new Array();
            matrix = matrix.concat([1,0,0,0,255]);
            matrix = matrix.concat([0,1,0,0,0]);
            matrix = matrix.concat([0,0,1,0,0]);
            matrix = matrix.concat([0,0,0,1,0]);

            var colorFilter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
            bmd.applyFilter(bmd, bmd.rect, new Point(0,0), colorFilter);

            var bitmap:Bitmap = new Bitmap(bmd);
            this.addChild(bitmap);
        }
    }
}

Вы также можете создать новые bitmapData, заполненные цветом, к которому нужно добавить градиент (вместо черного), и скопировать его в свой градиент с помощью BlendMode.ADD:

package
{
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.geom.Point;

    public class GreyscaleDemo extends Sprite
    {
        public function GreyscaleDemo()
        {
            var bmd:BitmapData = new GradientBMD(720,480);
            var bitmap:Bitmap = new Bitmap(bmd);
            this.addChild(bitmap);

            var bmd2:BitmapData = new BitmapData(720, 480, false, 0xFF0000);
            bmd.draw(bmd2, null, null, BlendMode.ADD, bmd.rect,false);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...