我正在尝试从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);
}
有更好的方法吗?
答案 0 :(得分:1)
我认为绘制的第五个参数是源矩形,所以你的意思是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轴),请删除 - from -source_y
答案 1 :(得分: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值处!
答案 2 :(得分: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);
}