4

BitmapData の内容を別のものに描画しようとしていますが、まだ作成されていません。
しかし、描画する前に、画像を拡大縮小して回転させ、描画する必要があります。
私の問題は、変換後の BitmapData のサイズがわからないため、新しいものを作成して描画できないことです。

このメソッドは、私が何を意味するかを示しています:

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;
}

変換後のこの画像のサイズを調べる (計算する) ために何をすべきか知っている人はいますか?


この画像は、実際の回転と、私が知りたいことを示しています。

ここに画像の説明を入力

4

3 に答える 3

1

わかりました、@ ansiartの回答を出発点として使用して、この方法で寸法を計算することができました:

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;
}

これは少しやり過ぎかもしれないと思いますが、うまくいきます。

于 2012-07-15T05:27:21.440 に答える
0

新しいビットマップ サイズを計算する必要はありません。元のものと同じサイズで新しい bitmapData を作成し、transparencyを true に設定し、fillColorパラメータを 0x00 に設定できます (これは 32 ビット イメージのアルファ値です)。このようにして、新しいbitmapDataオブジェクトは変換されたオブジェクトのみで埋められ、残りの画像データ構造は影響を受けません。

widthまたは、元の bitmapDataにheightスケーリング率を掛けて、プレースホルダー ビットマップ データのサイズを定義する別の方法があります。

于 2012-07-14T05:35:51.640 に答える
0

マトリックスには transformPoint メソッドがあります。これにより、topLeft/bottomRight の判別が容易になります。

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 に基づいてオフセットしてください。

于 2012-07-14T05:45:18.050 に答える