在没有填充的情况下将精灵绘制到位图数据上

Drawing sprite onto bitmapData without padding

我有一个精灵,它是一个旋转了 45 度的原始矩形。我想使用 BitmapData 创建一个 Bitmap 来准确地复制它。我认为 BitmapData#draw 只会对我的精灵起作用,所以我尝试了天真的方法:

var a = new Sprite();
a.graphics.beginFill(0xFF0000);
a.graphics.drawRect(0, 0, 200, 100);
a.graphics.endFill();
a.x = 100;
a.y = 100;
a.rotation = 45;

addChild(a);

var bitmapData = new openfl.display.BitmapData(1500, 1500, false, 0x00000000);
bitmapData.draw(a);

var bitmap = new openfl.display.Bitmap(bitmapData);
bitmap.x = 500;
bitmap.y = 100;
addChild(bitmap);

然而结果让我吃惊:

看起来它保留了变换矩阵(这实际上是有道理的,否则旋转将丢失)。所以我尝试了更稳健的方法:

var bitmapData = new openfl.display.BitmapData(1500, 1500, false, 0x00000000);

var rect = a.getBounds(a.parent);
var matrix = a.transform.concatenatedMatrix;
matrix.translate(-rect.left, -rect.top);
bitmapData.draw(a, matrix);

想要的结果是

仍然,结果与提供的图像相同。 我试过clipRect参数,但更奇怪的是,无论矩形有多大,对象都没有被复制(只剩下黑色space)。 我忘了 xy,剪辑不是问题

var bitmapData = new openfl.display.BitmapData(1500, 1500, false, 0x00000000);
var clip = new openfl.geom.Rectangle(1500, 1500);
bitmapData.draw(a, clip);

我在滥用 BitmapData#draw 吗?任何帮助表示赞赏

(它必须是 BitmapData,因为我必须在使用 BitmapData#hitTest 的像素完美碰撞测试中使用它)

OpenFL 4.0.0
使用 Cpp、Neko 和 HTML5

进行测试

谢谢。

对于 Flash,正确的结果应该是位图区域左上角的实心矩形,如下所示:

var sp:Sprite = new Sprite();
        sp.graphics.beginFill(0xff0000, 1);
        sp.graphics.drawRect(0, 0, 100, 50);
        sp.graphics.endFill();
        sp.x = 100;
        sp.y = 100;
        sp.rotation = 45;
        addChild(sp);
        var bd:BitmapData = new BitmapData(400, 400, false, 0);
        bd.draw(sp);
        var bm:Bitmap = new Bitmap(bd);
        bm.x = 200;
        bm.y = 0;
        addChild(bm);

结果:

真的,检查 OpenFL 行为,如果默认使用传递目标的变换矩阵,那么可以,但对于 Flash,默认行为是仅使用传递矩阵(如果有)。

编辑:也使用您的代码进行了测试:

var rect = sp.getBounds(sp.parent);
var matrix = sp.transform.concatenatedMatrix;
matrix.translate(-rect.left, -rect.top);
bd.draw(sp, matrix);

结果符合您的要求。所以是的,这应该是一个 OpenFL 错误。