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);
}
核心算法
/**
* 绘制一个大尺寸可视对象
* @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);
}
相关文章推荐
- 通过绘制在datagridview控件列头添加一个checkbox控件
- 通过绘制在datagridview控件列头添加一个checkbox控件
- Visio如何合并多张工作表(将多个文件合并成一个文件)
- 在网上看到一个通过css绘制各种图形的文章留底
- 一个Android自定义背景视图,通过触摸绘制类星空背景图
- 多张PDF文件合并成一个PDF文件
- [置顶] 【excel VBA】合并一个文件夹下多张excel表数据,前提字段一样
- 通过创建临时表合并某一个库的hive小文件
- Android通过播放多张图片形成一个动画 分类: Android 2015-04-24 14:05 16人阅读 评论(0) 收藏
- AS3 一个loader加载多张图片
- 绘制一个位图(Bitmap)对象
- 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- 通过绘制在datagridview控件列头添加一个checkbox控件
- 如何将EXCEL中同一个工作薄多张工作表合并
- 用中点位移法绘制山脉的一个粗糙AS3演示
- 3d Max中通过"附加(attach)"将多个对象合并为一个对象
- [转]通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- 通过输入cmd命令将保存在文件夹里的所有文本合并成一个文本
- C# 通过二进制,将多个文件合并为一个。