2009-06-08 32 views

risposta

67

Questo funziona:

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

funziona perfettamente, grazie! –

+2

questo '0x000000' è molto importante, senza che non ci sia trasparenza – Cherniv

1

Senza scrivere il codice da solo. Il modo in cui mi avvicinerei a questo sarebbe quello di creare un nuovo oggetto BitmapData della dimensione desiderata e quindi utilizzare il metodo bitmap.draw per copiare quello grande in quello piccolo. Il metodo bitmap.draw accetta anche un argomento matrice che è possibile utilizzare per ridimensionare quando si copia.

19
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 è un'interfaccia per DisplayObject e BitmapData.

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

+0

Non proprio quello che volevo, perché stavo iniziando con un bitmapdata piuttosto che con un oggetto di visualizzazione. grazie comunque! – Iain

+1

risolto facilmente sottotitolando DisplayObject con BitmapData ;-) – Carlo

+0

questo ha funzionato per me :-) – dharm0us

0

Il problema con l'utilizzo di ridimensionamento della matrice è che non fa alcuna antialiasing o smoothing - questo è probabilmente OK se si è sicuri che sarà solo mai stato downscaling, ma un metodo più generale userei la classe Image per fare il ridimensionamento. In AS3 questo non sarebbe mai stato aggiunto all'elenco di visualizzazione, quindi sarebbe stato usato solo "fuori schermo". Qualcosa di simile (con i tuoi dati bitmap come "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; 

È quindi possibile utilizzare "scaledBitmapData" al posto di "sourceBitmapData" di fare tutto ciò con.

+0

Da dove viene questa classe Image? http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/index.html?filter_flashplayer=10.1 non elenca una classe Image come parte della libreria AS3. – Dwayne

+0

Votato come nessun riferimento alla classe Image – Jotham

+0

è http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/Image.html o http://help.adobe.com /en_US/FlashPlatform/reference/actionscript/3/spark/components/Image.html –

10

Con levigante:

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

Il metodo draw accetta IBitmapDrawable che è un'interfaccia per DisplayObject e BitmapData.

0

Ecco una variante di quanto sopra che aggiunge il supporto per zoom, tratto e letterbox. Potrebbe non fornire il supporto per il ritaglio.

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