Растяжение BitmapData в AS3 - PullRequest
       16

Растяжение BitmapData в AS3

0 голосов
/ 13 апреля 2010

Я пытаюсь скопировать эту функцию из графической библиотеки Allegro:

void stretch_blit(BITMAP *source, BITMAP *dest, int source_x, 
                  int source_y, int source_width, int source_height, 
                  int dest_x, dest_y, dest_width, dest_height); 

http://www.allegro.cc/manual/api/blitting-and-sprites/stretch_blit

Это несколько сложно во Flash из-за перекрывающихся функций между аргументами Rectangle и Matrix метода AS3 BitmapData.draw ().

Это то, что я имею до сих пор. Он работает только большую часть времени и невероятно неэффективен (из-за необходимости дважды отбирать пиксели).

function stretch_blit(src:BitmapData, dest:BitmapData, source_x:int, source_y:int, 
   source_width:int, source_height:int, dest_x:int, dest_y:int, 
   dest_width:int, dest_height:int):void {
     var tmp:BitmapData = new BitmapData(dest_width, dest_height, true);
     var scalex:Number = dest_width/source_width;
     var scaley:Number = dest_height/source_height;
     var matrix:Matrix = new Matrix();
     var matrix2:Matrix = new Matrix();
     matrix.scale(scalex, scaley);
     matrix.translate(source_x, -source_y);
     tmp.draw(src, matrix, null, null, new Rectangle(0, 0, dest_width, dest_height));
     matrix2.translate(dest_x-source_x, dest_y-source_y);
     dest.draw(tmp, matrix2);
}

Есть ли лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 13 апреля 2010

Я думал, что 5-й параметр для рисования - это исходный прямоугольник, так что вы имеете в виду source_width и source_height?

В любом случае, попробуйте это:

function stretch_blit(src:BitmapData, dest:BitmapData, source_x:int, source_y:int,
source_width:int, source_height:int, dest_x:int, dest_y:int, dest_width:int, dest_height:int):void {
     var scalex:Number = dest_width/source_width;
     var scaley:Number = dest_height/source_height;
     var matrix:Matrix = new Matrix();
     matrix.scale(scalex, scaley);
     matrix.translate(dest_x, dest_y);
     dest.draw(src, matrix, null, null, new Rectangle(source_x, -source_y, source_width, source_height));
}

И если вы используете инвертированную ось y (ось y стиля вспышки), удалите - из -source_y

0 голосов
/ 21 июля 2012

Хотя этот вопрос несколько устарел, я подумал, что выложу рабочее решение. Это для двух общих объектов BitmapData, где sx, sy, sw и sh означают источник x, y, ширину и высоту соответственно.

function drawImage(src:BitmapData, dest:BitmapData, sx:int, sy:int, sw:int, sh:int, dx:int, dy:int, dw:int, dh:int):void
{
    var scaleX:Number = dw / sw, scaleY:Number = dh / sh;
    var m:Matrix = new Matrix();
    m.scale(scaleX, scaleY);
    m.translate(dx, dy);
    var temp:BitmapData = new BitmapData(sw, sh, src.transparent, 0);
    temp.copyPixels(src, new Rectangle(sx, sy, sw, sh), new Point());
    dest.draw(temp, m);
}
0 голосов
/ 13 апреля 2010

Спасибо, но ничего не рисуется, когда я пытаюсь его использовать. Я думаю, что это как-то связано с тем, что позиция x и y в clipRect смещена на позицию матрицы. Если вы используете это вместо:

    function stretch_blit(src:BitmapData, dest:BitmapData, source_x:int, source_y:int,
    source_width:int, source_height:int, dest_x:int, dest_y:int, dest_width:int, dest_height:int):void {
         var scalex:Number = dest_width/source_width;
         var scaley:Number = dest_height/source_height;
         var matrix:Matrix = new Matrix();
         matrix.scale(scalex, scaley);
         matrix.translate(dest_x, dest_y);
         dest.draw(src, matrix, null, null, new Rectangle(source_x+dest_x, source_y+dest_y, source_width, source_height));
    }

Затем рисуется правильный клип исходного растрового изображения, с правильным значением X в «dest», но с неправильным значением Y!

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