在没有填充的情况下将精灵绘制到位图数据上
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)。 我忘了 x
和 y
,剪辑不是问题
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 错误。
我有一个精灵,它是一个旋转了 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)。x
和 y
,剪辑不是问题
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 错误。