flash actionscript-3 image resize bitmapdata

flash - ¿Cuál es la mejor manera de cambiar el tamaño de un objeto BitmapData?



actionscript-3 image (6)

Aquí hay una variación de lo anterior que agrega soporte para zoom, stretch y letterbox. Es posible que no proporcione el soporte de recorte.

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

Digamos que tengo un BitmapData de 600x600 y quiero escalarlo a 100x100.


Con suavizado:

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

El método de dibujo acepta IBitmapDrawable que es una interfaz para DisplayObject y BitmapData.


El problema con el uso de la escala de la matriz es que no realiza ningún suavizado ni suavizado: probablemente esto sea correcto si está seguro de que solo habrá reducido la escala, pero un método más general usaría la clase Imagen para hacer el cambio de tamaño. En AS3, esto nunca se agregaría a la lista de visualización, por lo que solo se usaría como "fuera de pantalla". Algo así (con sus datos de mapa de bits como "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;

Luego puede usar "scaledBitmapData" en lugar de "sourceBitmapData" para hacer lo que quiera con.


Esto funciona:

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


Sin escribir el código yo mismo. La forma en que abordaría esto sería crear un nuevo objeto BitmapData del tamaño deseado y luego usar el método bitmap.draw para copiar el más grande al más pequeño. El método bitmap.draw también acepta un argumento de matriz que puede usar para escalar al copiar.