调整BitmapData对象的最佳方法是什么?

假设我有一个600×600的BitmapData,我想把它缩小到100×100。

这工作:

var scale:Number = 1.0/6.0; var matrix:Matrix = new Matrix(); matrix.scale(scale, scale); var smallBMD:BitmapData = new BitmapData(bigBMD.width * scale, bigBMD.height * scale, true, 0x000000); smallBMD.draw(bigBMD, matrix, null, null, null, true); var bitmap:Bitmap = new Bitmap(smallBMD, PixelSnapping.NEVER, true); 
 public function drawScaled(obj:IBitmapDrawable, thumbWidth:Number, thumbHeight:Number):Bitmap { var m:Matrix = new Matrix(); m.scale(WIDTH / obj.width, HEIGHT / obj.height); var bmp:BitmapData = new BitmapData(thumbWidth, thumbHeight, false); bmp.draw(obj, m); return new Bitmap(bmp); } 

IBitmapDrawable是DisplayObject和BitmapData的接口。

来自: http : //www.nightdrops.com/2009/02/quick-reference-drawing-a-scaled-object-in-actionscript/

平滑:

 function BitmapScaled(source:IBitmapDrawable, thumbWidth:Number, thumbHeight:Number):BitmapData { var mat:Matrix = new Matrix(); mat.scale(thumbWidth/source.width, thumbHeight/source.height); var bmpd_draw:BitmapData = new BitmapData(thumbWidth, thumbHeight, false); bmpd_draw.draw(source, mat, null, null, null, true); return bmpd_draw; } 

draw方法接受IBitmapDrawable ,它是DisplayObject和BitmapData的接口。

不用自己写代码。 我会这样做的方式是创build一个新的所需的大小的BitmapData对象,然后使用bitmap.draw方法将大的复制到小的。 bitmap.draw方法还接受一个matrix参数,您可以在复制时使用该参数进行缩放。

使用matrix缩放的问题是,它没有做任何反锯齿或平滑处理 – 如果您确定只会缩小比例,这可能是确定的,但是更常用的方法是使用Image类来进行大小调整。 在AS3中,这将永远不会被添加到显示列表,所以只会被用于“屏幕外”。 像这样的东西(你的位图数据为“sourceBitmapData”):

 var image:Image = new Image(); image.load(new Bitmap(sourceBitmapData, PixelSnapping.NEVER, true)); var scale:uint = 100/600; // this is from your example of 600x600 => 100x100 var scaledWidth:uint = sourceBitmapData.width * scale; var scaledHeight:uint = sourceBitmapData.height * scale; image.content.width = scaledWidth; image.content.height = scaledHeight; var scaledBitmapData:BitmapData = new BitmapData(scaledWidth, scaledHeight); scaledBitmapData.draw(image.content); image = null; 

然后你可以使用“scaledBitmapData”来代替“sourceBitmapData”去做任何事情。

这是上面的变化,增加了对缩放,拉伸和信箱的支持。 它可能不提供裁剪支持。

 var newSizeBitmapData:BitmapData = resizeBitmapData(myBitmapData, newWidth, newHeight); /** * Resize display object or bitmap data to a new size **/ public static function resizeBitmapData(bitmapDrawable:IBitmapDrawable, width:Number, height:Number, scaleMode:String="none", smooth:Boolean = true, transparent:Boolean = true, fillColor:Number = 0x00000000):BitmapData { var sizedBitmapData:BitmapData; var matrix:Matrix; matrix = getSizeByScaleMode(width, height, Object(bitmapDrawable).width, Object(bitmapDrawable).height, scaleMode); sizedBitmapData = new BitmapData(width, height, transparent, fillColor); sizedBitmapData.draw(bitmapDrawable, matrix, null, null, null, smooth); return sizedBitmapData; } // Get correct scale. Inspired from code in Apache Flex (license Apache 2.0) public static function getSizeByScaleMode(maxWidth:int, maxHeight:int, width:int, height:int, scaleMode:String="letterbox", dpi:Number=NaN):Matrix { var aspectRatio:String = (maxWidth < maxHeight) ? "portrait" : "landscape"; var orientation:String = aspectRatio; var matrix:Matrix = new Matrix(); var scaleX:Number = 1; var scaleY:Number = 1; switch(scaleMode) { case "zoom": scaleX = Math.max( maxWidth / width, maxHeight / height); scaleY = scaleX; break; case "letterbox": scaleX = Math.min( maxWidth / width, maxHeight / height); scaleY = scaleX; break; case "stretch": scaleX = maxWidth / width; scaleY = maxHeight / height; break; } if (scaleX != 1 || scaleY != 0) { width *= scaleX; height *= scaleY; matrix.scale(scaleX, scaleY); } matrix.translate(-width / 2, -height / 2); matrix.translate(maxWidth / 2, maxHeight / 2); return matrix; } 
Interesting Posts