代码之家  ›  专栏  ›  技术社区  ›  Iain

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

  •  36
  • Iain  · 技术社区  · 17 年前

    6 回复  |  直到 17 年前
        1
  •  69
  •   someOne    10 年前

    这起作用:

    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);
    
        2
  •  19
  •   1.21 gigawatts    9 年前
    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和位图数据的接口。

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

        3
  •  10
  •   1.21 gigawatts    9 年前

    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

        4
  •  1
  •   James Hay    17 年前

        5
  •  0
  •   MicroAngelo MicroAngelo    17 年前

    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“来做任何事情。

        6
  •  0
  •   1.21 gigawatts    9 年前

    这是上述的一个变体,增加了对缩放、拉伸和信箱的支持。它可能不提供剪切支持。

    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;
    }
    
    推荐文章