Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Неполное перекрашивание (http://www.flasher.ru/forum/showthread.php?t=207764)

Vlad84 06.05.2014 15:30

Неполное перекрашивание
 
Вложений: 1
Есть картинка (фон и черный текст), которую я обхожу getPixel-ом. Нужно перекрасить текст, но грани каждой буквы имеют сглаживание, т.е. цвет на гранях - это смесь цветов текста+цвет фона.

http://www.flasher.ru/forum/attachme...1&d=1399372099

Пока вижу только 2 решения:
1)Делать заливку нового цвета на 1-2 пикселя больше во все стороны.
2)Закрашивать все, что не равняется цвету фона (но вариант очень ограниченный).


Есть ли более точный метод?

in4core 06.05.2014 15:31

Glow black 2-2 strength 300%
Поробуй как вариант

Vlad84 06.05.2014 15:35

Не поможет, это единая картинка :(

in4core 06.05.2014 16:27

что то сразу не поможет. Вы находите по цвету где текст, делаете скриншот области через draw, создаете битмап (чисто текста ) и кладете поверх, а дальше любой фильтр можно :)

silin 07.05.2014 00:59

threshold'ом можно что-то разрулить, но сглаживание, естественно, похерится при этом
Код AS3:

var tol:int = 32;
/*
// вариант для черных букв на произвольном фоне: красим все, что черное с какой-то точностью
bmd.threshold(bmd, bmd.rect, new Point(), "<", 0xFF-tol, 0xFFFF0000, 0xFF);
*/

 
// вариант для любых букв на конкретном (0xB0FFFF) фоне: красим все, что отличается от фона с какой-то точностью
var map:BitmapData = new BitmapData(bmd.width, bmd.height, false, 0xB0FFFF );
map.draw(bmd, null, null, BlendMode.DIFFERENCE);
bmd.threshold(map, map.rect, new Point(), ">", tol, 0xFFFF0000, 0xFF);
map.dispose();


in4core 07.05.2014 01:14

Матерная какая то тема получилась по картинкам :)

Zebestov 07.05.2014 02:48

Вложений: 1
Вот и мой вариант :)
ColorFill.swf   (4.4 Кб)

Код AS3:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Point;
import flash.filters.ColorMatrixFilter;
import flash.geom.Rectangle;
import flash.display.BitmapDataChannel;
 
// Это наше изображение с растеризованным текстом.
var msk:BitmapData = new RasterizedText();
 
// Здесь окажется наш результат.
var bmd:BitmapData = new BitmapData(msk.rect.width, msk.rect.height);
var bmp:Bitmap = new Bitmap(bmd);
    bmp.y = 200;
    addChild(bmp);
 
 
// Цвет фона и текста.
var bgColor:uint = msk.getPixel32(0, 0);
var txColor:uint = 0xffff0000;
 
// РАЗ: Обесцвечиваем растр.
desaturate(msk);
 
// ДВА: Подтягиваем уровни.
levels(msk, msk.getPixel32(0, 0));
 
// ТРИ: Разукрашиваем.
colorize(bmd, msk, bgColor, txColor);
 
/** Обесцвечивает растровое изображение. */
function desaturate(bmd:BitmapData):void
{
        var r:Number=0.212671;
        var g:Number=0.715160;
        var b:Number=0.072169;
 
        var matrix:Array = [r, g, b, 0, 0,
                        r, g, b, 0, 0,
                        r, g, b, 0, 0,
                        0, 0, 0, 1, 0];
 
        bmd.applyFilter(bmd, bmd.rect, new Point(), new ColorMatrixFilter(matrix));
}
 
/** Вытягивает уровни растра, делая указанный уровень white белым. */
function levels(bmd:BitmapData, white:uint):void
{
        var l:Number = 255 / (white & 0xff);
 
        var matrix:Array = [l, 0, 0, 0, 0,
                        0, l, 0, 0, 0,
                        0, 0, l, 0, 0,
                        0, 0, 0, 1, 0];
 
        bmd.applyFilter(bmd, bmd.rect, new Point(), new ColorMatrixFilter(matrix));
}
 
/** Разукрашивает картинку с текстом. */
function colorize(bmd:BitmapData, msk:BitmapData, bgColor:uint, txColor:uint):void
{
        var rct:Rectangle = bmd.rect;
        var pnt:Point = new Point();
        var tmp:BitmapData = new BitmapData(rct.width, rct.height, true, bgColor);
            tmp.copyChannel(msk, rct, pnt, BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
        bmd.fillRect(rct, txColor);
        bmd.copyPixels(tmp, rct, pnt, msk, pnt, true);
}


silin 07.05.2014 16:44

Вложений: 1
до кучи
recolor.swf   (11.3 Кб)

Код AS3:

package 
{
        import flash.display.*;
        import flash.filters.*;
        import flash.geom.*;
 
 
        public class Main extends Sprite
        {
                [Embed(source="screen.jpg")]
                private const screen_jpg:Class;
 
 
                public function Main():void
                {
 
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
 
                        // исходное изображение
                        var bmd:BitmapData = (new screen_jpg() as Bitmap).bitmapData;
 
                        var p:Point = new Point();
                        var r:Rectangle = bmd.rect;
                        var bgColor:uint = bmd.getPixel32(0, 0);
                        var txColor:uint = 0xFF0000;
 
                        // разница между фоном и битмапом
                        var mask:BitmapData = new BitmapData(bmd.width, bmd.height, true, bgColor );
                        mask.draw(bmd, null, null, BlendMode.DIFFERENCE);
 
                        // 'перекладывем' rgb в альфу
                        var h:Vector.<Vector.<Number>> = mask.histogram();
                        var k:Number=0;
                        for (var i:int = 0; i < 3; i++)
                        {
                                for (var j:int = 0; j < 255; j++) if (!h[i][j]) break;
                                k += j;
                        }
                        k = 0xFF / k;
                        var matrix:Array = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, k, k, k, 0, 0];
                        mask.applyFilter(mask, r, p, new ColorMatrixFilter(matrix));
 
                        //  закрашиваем фон по маске
                        var res:BitmapData = new BitmapData(bmd.width, bmd.height, false, bgColor);
                        var fill:BitmapData = new BitmapData(bmd.width, bmd.height, false, txColor);
                        res.copyPixels(fill, r, p, mask, p);
 
                        fill.dispose();
                        mask.dispose();
 
                        addChild(new Bitmap(bmd));
                        addChild(new Bitmap(res)).y=bmd.height;
 
 
                }
 
        }
 
}


Zebestov 08.05.2014 12:58

Вложений: 1
Вложение 30858

silin 08.05.2014 21:56

ну да..
я стал мудрить из-за того, что твой вариант не всякий расклад фон-шрифт подымет, ну я типа хотел чтоб универсальный, но как-то идеального все равно не вышло


Часовой пояс GMT +4, время: 15:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.