Цитата:
Это через матрицу делать надо?
|
я бы наоборот закрашивал маску в режиме blendMode "eraze", ибо "рисовать прозрачные пиксели" можно только математически устанавливая каждый пиксель)) Но вот с получением этой самой "обратной" маски с дыркой-фигурой понадобится возня.
Как другой вариант — делаешь синюю битмапдату, копируешь в нее альфа-канал с исходной картинки (получаешь синюю картинку). Там где водишь мышкой, копируешь пиксели с исходной битмапдаты. Никаких масок))
Но если считать проценты обязательно, то лучше всетаки иметь отдельную "синюю" битмапдату и "стирать" её.
Тогда можно предварительно посчитать непрозрачные пиксели и считать это за 100% (или 0% стертости), и потом соотв. пересчитывать сколько их осталось и сколько это процентов. Но не уверен, что скорость подсчета будет удовлетворительной(
Как-то так..
Код AS3:
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BlendMode;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
/**
* ...
* @author Wolsh
*/
public class Main extends Sprite
{
[Embed(source = "../lib/img_3.png")]
private var _Img:Class;
private var _maskContainer:Sprite;
private var _invertMaskBMD:BitmapData;
private var _brushBMD:BitmapData;
private var _sourcePixelsCount:uint;
public function Main()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var imageBMD:BitmapData = (new _Img() as Bitmap).bitmapData;
var sourceImg:Bitmap = new Bitmap(imageBMD);
this.addChild(sourceImg);
sourceImg.x = 100;
sourceImg.y = 100;
//// бутерброд с BlendMode
var maskBMD:BitmapData = new BitmapData(imageBMD.width, imageBMD.height, true, 0xFF0000FF);
var maskBitmap:Bitmap = new Bitmap(maskBMD);
_maskContainer = new Sprite();
this.addChild(_maskContainer);
_maskContainer.x = 100;
_maskContainer.y = 100;
_maskContainer.blendMode = BlendMode.LAYER;
_maskContainer.addChild(maskBitmap);
var imageMask:Bitmap = new Bitmap(imageBMD);
_maskContainer.addChild(imageMask);
imageMask.blendMode = BlendMode.ERASE;
//// инвертируем маску
_invertMaskBMD = new BitmapData(imageBMD.width, imageBMD.height, true, 0x000000FF);
_invertMaskBMD.draw(_maskContainer, null, null, BlendMode.LAYER);
imageMask.bitmapData = _invertMaskBMD;
//// "кисточка"
_brushBMD = new BitmapData(40, 40, true, 0x00FFFFFF);
var brushShape:Shape = new Shape();
brushShape.graphics.beginFill(0x0000FF);
brushShape.graphics.drawCircle(20, 20, 20);
_brushBMD.draw(brushShape);
//// слушатель рисовалки
_maskContainer.addEventListener(MouseEvent.MOUSE_MOVE, handlerDraw);
}
private function handlerDraw(e:MouseEvent):void
{
_invertMaskBMD.copyPixels(_brushBMD, new Rectangle(0, 0, 40, 40), new Point(e.localX -20, e.localY - 20), null, null, true);
}
}
}