![]() |
|
||||||||||
|
|||||
|
Регистрация: Jul 2012
Сообщений: 148
|
Есть картинка (фон и черный текст), которую я обхожу getPixel-ом. Нужно перекрасить текст, но грани каждой буквы имеют сглаживание, т.е. цвет на гранях - это смесь цветов текста+цвет фона.
Пока вижу только 2 решения: 1)Делать заливку нового цвета на 1-2 пикселя больше во все стороны. 2)Закрашивать все, что не равняется цвету фона (но вариант очень ограниченный). Есть ли более точный метод? |
|
|||||
|
Регистрация: Jul 2012
Сообщений: 148
|
Не поможет, это единая картинка
![]() |
|
|||||
|
threshold'ом можно что-то разрулить, но сглаживание, естественно, похерится при этом
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(); |
|
|||||
|
Lorem ipsum
|
Вот и мой вариант
![]() 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); }
__________________
Поймай яблоко 2! |
|
|||||
|
до кучи
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; } } } Последний раз редактировалось silin; 07.05.2014 в 23:19. |
|
|||||
|
Lorem ipsum
|
__________________
Поймай яблоко 2! |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:01. |
|
|
« Предыдущая тема | Следующая тема » |
|
|