Actionscript 3 基于矩阵计算新位图数据的大小

Actionscript 3 基于矩阵计算新位图数据的大小,actionscript-3,matrix,image-manipulation,Actionscript 3,Matrix,Image Manipulation,我正在尝试将位图数据的内容绘制到另一个尚待创建的位图数据中。 但在绘制之前,我需要缩放和旋转图像,然后绘制它。 我的问题是,我不知道转换后位图数据的大小,因此无法创建新的位图数据来绘制它 这个方法说明了我的意思: public function getTransformedBitmapData(origin:BitmapData):BitmapData { var matrix:Matrix = new Matrix(); // ajusting the anchor poin

我正在尝试将位图数据的内容绘制到另一个尚待创建的位图数据中。
但在绘制之前,我需要缩放和旋转图像,然后绘制它。
我的问题是,我不知道转换后位图数据的大小,因此无法创建新的位图数据来绘制它

这个方法说明了我的意思:

public function getTransformedBitmapData(origin:BitmapData):BitmapData
{
    var matrix:Matrix = new Matrix();

    // ajusting the anchor point and rotating
    matrix.translate(-origin.width / 2, -origin.height / 2);
    matrix.rotate(Math.PI / 4); // 45 deg
    matrix.translate(origin.width / 2, origin.height / 2);

    // scaling
    matrix.scale(1.5, 1.5);

    // Calculating the size of the new BitmapData
    var width:Number = 0; // I don't know this value!
    var height:Number = 0; // I don't know this value!

    // Creating and drawing (with transformation)
    var result:BitmapData = new BitmapData(width, height, true, 0);
    result.draw(origin, matrix);

    return result;
}
有人知道我应该做什么来找出(计算)变换后这张图像的大小


此图说明了旋转的作用,以及我想了解的内容:


无需计算新位图大小。您可以创建与原始位图数据大小相同的新位图数据,并将
透明度设置为true,将
fillColor
参数设置为0x00(这是32位图像上的alpha值)。这样,新的
bitmapData
将仅用转换的对象填充,图像数据结构的其余部分不会受到影响


或者还有另一种方法,通过将原始位图数据
宽度
高度
乘以缩放比来定义占位符位图数据大小。

矩阵有一种转换点方法。这将便于确定左上/右下

var matrix:Matrix = new Matrix();

// do stuff to matrix
var topLeft:Point   = matrix.transformPoint(new Point(0,0));
var bottomRight:Point   = matrix.transformPoint(new Point(width,height));

// determine bounds of rectangle based on points (note: bottomRight might be now the topLeft, so need to do testing

但是,如果要绘制此新位图,请确保基于tx/ty进行偏移。

好的,使用@ansiart answer作为起点,我以这种方式计算尺寸:

public function getTransformedBitmapData(origin:BitmapData):BitmapData
{
    var matrix:Matrix = new Matrix();

    // ajusting the anchor point and rotating
    matrix.translate(-origin.width / 2, -origin.height / 2);
    matrix.rotate(Math.PI / 4); // 45 deg
    matrix.translate(origin.width / 2, origin.height / 2);

    // scaling
    matrix.scale(1.5, 1.5);

    // Finding the four corners of the bounfing box after transformation
    var topLeft:Point = matrix.transformPoint(new Point(0, 0));
    var topRight:Point = matrix.transformPoint(new Point(origin.width, 0));
    var bottomLeft:Point = matrix.transformPoint(new Point(0, origin.height));
    var bottomRight:Point = matrix.transformPoint(new Point(origin.width, origin.height));

    // Calculating "who" is "where"
    var top:Number = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
    var bottom:Number = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
    var left:Number = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
    var right:Number = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);

    // Ajusting final position
    matrix.translate(-left, -top);

    // Calculating the size of the new BitmapData
    var width:Number = right - left;
    var height:Number = bottom - top;

    // Creating and drawing (with transformation)
    var result:BitmapData = new BitmapData(width, height, false, 0);
    result.draw(origin, matrix);

    return result;
}

我认为这可能有点过火,但有效

在我的示例中,我设置了透明度和fillColor(
newBitMapData(width,height,true,0);
),但这不是问题的一部分。我需要计算大小,因为我要绘制的图像肯定会比原始图像更大(注意
矩阵。缩放(1.5,1.5);
),即使我没有缩放,旋转后我仍然会有更大的图像。添加屏幕截图以理解所需的旋转剪辑。@jasonturges,图像添加。这个概念很简单,但我找不到编码的方法。为什么你需要更快的东西?带有矩阵的bmp.draw()将是该函数所需计算量的99.9999999%——即,即使它更快,它也将以极小的速度更快。是的,你可以不用使用矩阵函数来做所有的矩阵运算,这会给你速度,但我认为你最多可以减少0.0001毫秒左右。这对我不起作用。减去这些点就得到了一个零宽度的矩形。我做错什么了吗?更新!我设法用transformPoint(点)找出尺寸。“变量宽度:数字=底部-顶部;”-打字?也许它应该是--“var-width:Number=right-left;”。同样的高度呢?