我有一个填充形状,以及一个与Shape的边界框宽度和高度相同的BitmapData。
我需要从BitmapData中剪切Shape(基本上将BitmapData绘制到形状上......)[如此:http://imgur.com/uwE5F.png]
我使用相当骇人的方法:
public static function cutPoly(img:BitmapData, s:Shape, bounds:Bounds):BitmapData {
var temp:BitmapData = new BitmapData(bounds.width, bounds.height, true);
Main.inst.stageQuality("low"); //hack to kill anti-aliasing
temp.draw(s,new Matrix());
Main.inst.stageQuality("high"); // end hack
//0xFF00FF00 is the color of the shape
makeColTrans(temp,0xFF00FF00); //makes the color transparent :P
//return temp;
img.draw(temp);
//img.draw(temp);
temp.dispose();
makeColTrans(img, 0xFFFFFFFF);
return img;
}
我想知道是否有更好的方法......不仅仅是黑客攻击。
答案 0 :(得分:5)
它也可以被认为是hack但你可以在容器精灵中添加位图和(绘制的)形状,用形状掩盖位图并再次绘制结果图像。您获得的唯一好处是使用运行时的原生绘图算法,只有当您的makeColTrans逐个像素地扫描整个位图时才会这样。
为代码示例编辑:
public static function cutPoly(sourceBitmapData:BitmapData, maskShape:Shape, bounds:Rectangle):BitmapData {
// you might not need this, supplying just the sourceBitmap to finalBitmapData.draw(), it should be tested though.
var sourceBitmapContainer:Sprite = new Sprite();
sourceBitmapContainer.addChild(sourceBitmap);
sourceBitmapContainer.addChild(maskShape);
var sourceBitmap:Bitmap = new Bitmap(sourceBitmapData);
maskShape.x = bounds.x;
maskShape.y = bounds.y;
sourceBitmap.mask = maskShape;
var finalBitmapData:BitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00ffffff);
// or var finalBitmapData:Bitmap = new BitmapData(maskShape.width, maskShape.height); not too sure about the contents of the bounds...
finalBitmapData.draw(sourceBitmapContainer);
return finalBitmapData;
}
答案 1 :(得分:1)
draw()方法的第二个参数采用变换矩阵 - 您可以在此处指定偏移,旋转,倾斜等。然后使用该bitmapdata对象作为形状上beginBitmapFill的源。
答案 2 :(得分:0)
形状周围的颜色是否一致?如果是这样,您可以找到该彩色像素的第一个实例,并从该坐标中找到具有0x00000000的位图数据floodFill(),然后将结果绘制到新的透明位图数据。
修改的
这是使用阈值的另一个例子。它远非完美,但它确实让你成为那里的一部分。在这种情况下,“Tile”类只是您在问题中使用链接ID提供的图像。
import flash.display.BitmapData;
import flash.geom.Point;
import flash.display.Bitmap;
var sample : Tile = new Tile();
var alphaBitmap : BitmapData = new BitmapData ( sample.width, sample.height, true, 0x00000000 );
alphaBitmap .draw ( sample );
alphaBitmap.threshold( alphaBitmap, alphaBitmap.rect, new Point(), "<", 0xFFEFEFEF, 0xFFFFFFFF, 0xFFFFFFFF );
alphaBitmap.threshold( alphaBitmap, alphaBitmap.rect, new Point(), "!=", 0xFFFFFFFF, 0x00000000 );
addChild ( new Bitmap ( alphaBitmap ) );
var source : Tile = new Tile();
var output : BitmapData = new BitmapData ( sample.width, sample.height, true, 0x00000000 );
output.copyPixels( source, source.rect, new Point(), alphaBitmap );
var outputBitmap : Bitmap = new Bitmap ( output );
outputBitmap.x = outputBitmap.width;
addChild ( outputBitmap );
答案 3 :(得分:0)
如果您希望这个“cookie-cut”算法主要仅使用BitmapData对象,请考虑以下事项:
var bmp:BitmapData = pSourceBmp.clone();
var alphaBmp:BitmapData = new BitmapData(shape.width, shape.height, true, 0);
alphaBmp.draw( shape );
var alphaOrigin:Point = new Point();
var pasteOrigin:Point = new Point();
bmp.copyPixels( bmp, bmp.rect, pasteOrigin, alphaBmp, alphaOrigin, true);
注意:此代码未经过测试。
我在Blitting引擎中使用了类似这样的东西来实现“cookie-cutting”的目的,它可以很好地从任何给定的矢量图形中提取形状。有趣的替代面具。