Отразить изображение вокруг центра - PullRequest
1 голос
/ 05 января 2012

Чтобы перевернуть изображение вокруг центра, я использую этот фрагмент кода:

        // Calculate offset
        var offsetWidth:Number = image.contentWidth/2.0;
        var offsetHeight:Number =  image.contentHeight/2.0;
        // Perform flip
        var matrix:Matrix = new Matrix();
        matrix.translate(-offsetWidth, -offsetHeight);
        if(direction=="HORIZONTAL"){
            matrix.scale(-1, 1);
        }else if(direction=="VERTICAL"){
            matrix.scale(1,-1)
        }
        matrix.translate(+offsetWidth, +offsetHeight);
        matrix.concat(image.transform.matrix);
        image.transform.matrix = matrix.clone();

, который работает нормально. Но моя проблема заключается в том, когда я пытаюсь получить BitmapData из изображения, как это:

        var bitmapData:BitmapData = new BitmapData(image.width,image.height); 
        bitmapData.draw(image);

и использовать bitmapData в качестве источника для другого изображения, изображение не отображается. Отображается значок разбитого изображения .Кроме того, я вращаю изображение вокруг центра и использую аналогичный код, как указано ниже, и он работает нормально, и я могу скопировать растровые данные в другое изображение. Вот код для справки:

   var matrix:Matrix = new Matrix(); 
   matrix.rotate(Math.PI/2); 
   matrix.tx = img.content.height; 
   var bd:BitmapData = new BitmapData(img.content.height, img.content.width);   
   bd.draw(img.content, matrix);

Пожалуйста, помогите относительното же самое.

1 Ответ

2 голосов
/ 05 января 2012

Ответ на вопрос.

Во втором случае вы используете матрицу

bd.draw(img.content, matrix);

Аналогично для переворачивания

bitmapData.draw(image, matrix);

EDIT:

Расчет перевода для матрицы при перевороте не корректен. Оба перевода по X и Y необходимы только при горизонтальном и вертикальном переворачивании. Пожалуйста, найдите код ниже, в котором он работает.

package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.StageScaleMode;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;

    [SWF(width="640", height="480")]

    public class FlipRotate extends Sprite
    {
        [Embed(source="away3d.jpg")]
        private var Pic:Class;


        public function FlipRotate()
        {
            super();

            stage.scaleMode = StageScaleMode.NO_SCALE;


            var sourceImage:Bitmap;
            var targetImage:Bitmap;

            sourceImage = new Pic();

            //flip(sourceImage, "BOTH");
            flip(sourceImage, "VERTICAL");
            //flip(sourceImage, "BOTH");

            rotate(sourceImage, Math.PI/3);



            targetImage = new Bitmap();

            /* Get the current bounds of source image to calculate the dimenstion of new image
             Apply translation to bring the content outside into view in new image */
            var bounds:Rectangle = sourceImage.getBounds(this);
            var matrix:Matrix = sourceImage.transform.matrix;
            matrix.translate(-bounds.x, -bounds.y);

            /* Draw in new image applying translated matrix of source imgae */
            targetImage.bitmapData = new BitmapData(bounds.width, bounds.height);
            targetImage.bitmapData.draw(sourceImage, matrix);

            /* Add new image and postion at the center of stage */
            addChild(targetImage);
            targetImage.x = (stage.stageWidth-targetImage.width)/2;
            targetImage.y = (stage.stageHeight-targetImage.height)/2;

        }

        public function flip(image:Bitmap, direction:String):void{

            var matrix:Matrix = image.transform.matrix;

            if(direction=="HORIZONTAL"){
                matrix.scale(-1, 1);
                matrix.translate(image.width, 0);
            }else if(direction=="VERTICAL"){
                matrix.scale(1,-1);
                matrix.translate(0, image.height);
            }else if(direction == "BOTH"){
                matrix.scale(-1,-1);
                matrix.translate(image.width, image.height);
            }

            image.transform.matrix = matrix;

        }   

        public function rotate(image:Bitmap, angle:Number):void{

            var matrix:Matrix = image.transform.matrix;

            matrix.translate(-image.width/2, -image.height/2);
            matrix.rotate(angle); 
            matrix.translate(image.width/2, image.height/2);

            image.transform.matrix = matrix;

        }   


    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...