0

我正在尝试从 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 中有些困难,因为 AS3 的 BitmapData.draw() 方法的 Rectangle 和 Matrix 参数之间的功能重叠。

这就是我到目前为止所拥有的。它只在大部分时间有效,而且效率极低(由于必须对像素进行两次采样)。

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

有一个更好的方法吗?

4

3 回答 3

1

我认为要绘制的第 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 轴(flash 风格的 y 轴),请从 -source_y 中删除 -

于 2010-04-12T20:33:49.697 回答
0

谢谢,但是当我尝试使用它时没有绘制任何内容。我认为这与 clipRect 的 x 和 y 位置被 Matrix 的位置偏移有关。如果您改用它:

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

然后在“dest”中正确的 X 值处绘制源位图的正确剪辑,但在错误的 Y 值处!

于 2010-04-12T20:54:41.910 回答
0

虽然这个问题有点老了,但我想我会发布一个可行的解决方案。这适用于两个通用 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);
}
于 2012-07-21T19:04:17.867 回答