您的位置:首页 > 其它

As3 通过绘制多张位图合并成一个超大的位图

2016-09-08 14:43 253 查看
该算法将裁剪区域放大到最接近输出尺寸的大小,并且将形成的图像居中处理。

核心算法

/**
* 绘制一个大尺寸可视对象
* @param image 需要绘制的对象
* @param rect 对象绘制区域
* @param outWidth 输出图像的宽度
* @param outHeight 输出图像的高度
* @param maxWidth 单个bitmapdata绘制的极限宽度
* @param maxHeight 单个bitmapdata绘制的极限高度
* */
private function drawBigImage(image:DisplayObject,rect:Rectangle,outWidth:Number,outHeight:Number,maxWidth:Number=1024,maxHeight:Number=1024):BitmapData
{
if(image==null)
{
return null;
}
if(rect==null)
{
rect = new Rectangle(0,0,image.width,image.height);
}
var offsetX:Number = 0;
var offsetY:Number = 0;
var scale:Number = 1;
var outImageWidth:Number = rect.width;
var outImageHeight:Number = rect.height;
var fillColor:uint = 0xeeeeee;
var m:Matrix = new Matrix();
var whScale:Number = rect.width / rect.height;
var data:BitmapData = new BitmapData(outWidth,outHeight,false,fillColor);

var tempData:BitmapData = null;
if(outWidth <= maxWidth && outHeight <= maxHeight)
{
image.scrollRect = rect;//移动裁剪区域
if(outWidth<outHeight)//纵
{
scale = outWidth / outImageWidth;//宽度缩放
offsetY = (outHeight - outImageHeight*scale)/2;
m.scale(scale,scale);
m.translate(0,offsetY);
}
else//横
{
scale = outHeight / outImageHeight;//宽度缩放
offsetX = (outWidth - outImageWidth*scale)/2;
m.scale(scale,scale);
m.translate(offsetX,0);
}
data.draw(image,m);
}
else
{
var cols:int = Math.ceil(outWidth / maxWidth);
var rows:int = Math.ceil(outHeight / maxHeight);

if(outWidth<outHeight)//纵
{
scale = outWidth / outImageWidth;//宽度缩放
}
else//横
{
scale = outHeight / outImageHeight;//宽度缩放
}

m.scale(scale,scale);
var source:BitmapData = new BitmapData(outWidth,outHeight,false,fillColor);

var unitImageWidth:Number = rect.width / cols;
var unitImageHeight:Number = rect.height / rows;

for (var i:int = 0; i < rows; i++)
{
for (var j:int = 0; j < cols; j++)
{
var itemImageWidth:Number = unitImageWidth;
var subWidth:Number = (j+1) * itemImageWidth-rect.width;
if(subWidth>0)
{
itemImageWidth = rect.width - itemImageWidth * j;
}

var itemImageHeight:Number = unitImageHeight;
var subHeight:Number = (i+1) * itemImageHeight - rect.height;
if(subHeight>0)
{
itemImageHeight = rect.height - itemImageHeight * i;
}
image.scrollRect = new Rectangle(
rect.x + j * unitImageWidth,
rect.y + i * unitImageHeight,
itemImageWidth,
itemImageHeight);//移动裁剪区域

tempData = new BitmapData(itemImageWidth*scale,itemImageHeight*scale);

tempData.draw(image,m);
source.copyPixels(tempData,new Rectangle(0,0,tempData.width,tempData.height),new Point(j*itemImageWidth*scale,i*itemImageHeight*scale));
tempData.dispose();
}
}

var matrix:Matrix = new Matrix();
if(outWidth<outHeight)//纵
{
offsetY = (outHeight - outImageHeight*scale)/2;
matrix.translate(0,offsetY);
}
else//横
{
offsetX = (outWidth - outImageWidth*scale)/2;
matrix.translate(offsetX,0);
}

data.draw(source,matrix);
source.dispose();
}
image.scrollRect = null;//还原裁剪区域
return data;
}

调用

private function testDraw(image:DisplayObject):void
{
//设置裁剪区域
var rect:Rectangle = new Rectangle(100,120,200,100);

var shape:Shape = new Shape();
shape.x = rect.x;
shape.y = rect.y;
shape.graphics.lineStyle(2,0x00ff00);
shape.graphics.drawRect(0,0,rect.width,rect.height);
addChild(shape);

var oldHeight:Number = image.height;
var bitmap:Bitmap = new Bitmap(drawBigImage(image,rect,1000,300));//绘制一张1000*300的位图
bitmap.y = image.y+oldHeight;
addChild(bitmap);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 位图 matrix