3

我有一个使用应用程序绘制的Shape.graphics.drawRoundRect()形状lineStyle。我正在尝试捕获该形状作为Bitmap使用BitmapData.draw(),但我遇到了笔画问题。见下文:

在此处输入图像描述

如您所见,使用draw()( 和drawWithQuality()) 时,笔画会被剪掉。这条线以对象为中心绘制,因此厚度为 4(如我在示例中使用的)在形状区域外有 2 个像素,在其内有 2 个像素。draw() 似乎捕获了从 (0,0) 到 (BitmapData.width,BitmapData.height) 的所有内容,因此 (0,0) 左侧和顶部的所有内容都丢失了。我尝试使用 clipRect 选项进行补偿,但讽刺的是,这只是使剪裁的边框变得均匀。

知道如何捕获剩余的数据吗?

4

2 回答 2

3

作为更通用的解决方案,您可以在其自己的坐标空间中获取对象的边界,并使用它来设置的大小BitmapData和偏移量draw()

import flash.geom.Matrix;
import flash.geom.Rectangle;

const thickness:int = 4;
const radius:int = 10;
const size:int = 100;

var shape:Shape = new Shape();
shape.graphics.lineStyle( thickness, 0xaaaaaa );
shape.graphics.beginFill( 0xdddddd );
shape.graphics.drawRoundRect( 0, 0, size, size, radius, radius );
shape.graphics.endFill();
addChild( shape );

var bounds:Rectangle = shape.getBounds(shape);
var m:Matrix = new Matrix();
m.translate(-bounds.left, -bounds.top);

var bmp1:Bitmap = new Bitmap();
bmp1.bitmapData = new BitmapData( bounds.width, bounds.height, true, 0 );
bmp1.x = 310;
bmp1.y = 100;
addChild( bmp1 );
bmp1.bitmapData.draw( shape, m );
于 2013-04-09T20:19:43.833 回答
1

当然,在我发布问题的那一刻,我就想出了解决办法。您必须偏移您的形状以匹配边界之外的线条,并补偿使用绘图时线条添加到形状的额外尺寸

const thickness:int = 4;
const radius:int = 10;
const size:int = 100;

var shape:Shape = new Shape();
shape.graphics.lineStyle( thickness, 0xaaaaaa );
shape.graphics.beginFill( 0xdddddd );
shape.graphics.drawRoundRect( thickness / 2, thickness / 2, size, size, radius, radius );
shape.graphics.endFill();
addChild( shape );

var bmp1:Bitmap = new Bitmap();
bmp1.bitmapData = new BitmapData( size + thickness, size + thickness, true, 0 );
bmp1.x = 310;
bmp1.y = 100;
addChild( bmp1 );
bmp1.bitmapData.draw( shape );

在此处查看结果(您可以忽略剪辑矩形):

在此处输入图像描述

于 2013-04-09T19:28:57.693 回答