2009-06-08 2 views

ответ

67

Это работает:

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

работает отлично, спасибо! –

+2

этот '0x000000' очень важен, без него нет прозрачности – Cherniv

1

Без написания кода. Способ, которым я хотел бы подойти, это создать новый объект BitmapData желаемого размера, а затем использовать метод bitmap.draw для копирования большого на маленький. Метод bitmap.draw также принимает матричный аргумент, который можно использовать для масштабирования при копировании.

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 является интерфейсом для DisplayObject и BitmapData.

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

+0

На самом деле я не хотел, потому что начинал с bitmapdata, а не с экранного объекта. Спасибо хоть! – Iain

+1

легко фиксируется путем субтитрации DisplayObject с BitmapData ;-) – Carlo

+0

этот работал для меня :-) – dharm0us

0

Проблема с использованием матрицы масштабирования является то, что он не делает никакого сглаживания или сглаживания - это, вероятно, хорошо, если вы уверены, что вы будете только когда-либо разукрупнение, но более общий метод будет использовать класс 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», чтобы делать то, что с.

+0

. Откуда этот класс изображения? http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/index.html?filter_flashplayer=10.1 не отображает класс изображения как часть библиотеки AS3. – Dwayne

+0

Проголосовало как ссылка на Image class – Jotham

+0

, это либо http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/Image.html, либо http://help.adobe.com /en_US/FlashPlatform/reference/actionscript/3/spark/components/Image.html –

10

С сглаживанием:

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

Метод дро принимает IBitmapDrawable который представляет собой интерфейс для DisplayObject и BitmapData.

0

Ниже приведена вариация, которая добавляет поддержку масштабирования, растяжения и почтового ящика. Он не может обеспечить поддержку отсечения.

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

 Смежные вопросы

  • Нет связанных вопросов^_^