繁体   English   中英

在 Flex 中使用 as3 调整图像大小

[英]Resize images in Flex using as3

我正在使用加载器加载图像。 加载后,我可以使用Bitmap(event.target.loader.content).bitmapData获取 bitmap 数据。

然而,由于我正在加载的图像非常大(大约 2000 x 1600),我想减小尺寸并创建一个新的更小的 bitmap 可能 200 或 300 像素宽,有点像缩略图。

我认为这与创建具有新大小的新BitmapData有关。 但是我无法让它正常工作。

有任何想法吗?

未经测试,但这应该给你一个想法:

public function scaleBitmap(src: BitmapData, ratio: Number): BitmapData
{
    var bmd: BitmapData = new BitmapData(src.width * ratio, src.height * ratio);
    var m: Matrix = new Matrix();   
    m.scale(ratio, ratio);
    bmd.draw(src, m);
    return bmd;
}

您也可以使用来自 BitmapImage class 的代码。 我已经更新它以支持 BitmapData class 的 drawWithQuality 方法。 有关值,请参阅 StageQuality class。

注意:您需要将 SWF 版本设置为至少 16 才能使用质量 API。 但是,无论哪种方式,编译器似乎都不会引发错误。

    /**
     * @private
     * Utility function used for higher quality image scaling. Essentially we
     * simply step down our bitmap size by half resulting in a much higher result
     * though taking potentially multiple passes to accomplish.
     * 
     * source spark.primitives.BitmapImage
     */
    protected static function resample(bitmapData:BitmapData, newWidth:uint,
                                       newHeight:uint, quality:String = null):BitmapData
    {

        var finalScale:Number = Math.max(newWidth/bitmapData.width,
            newHeight/bitmapData.height);

        var finalData:BitmapData = bitmapData;

        // ERROR HERE MEANS
        // Property drawWithQuality not found on flash.display.BitmapData and there is no default value.
        // 
        // Solution
        // add -swf-version=16 or greater to your compiler arguments
        // 
        // https://bugbase.adobe.com/index.cfm?event=bug&id=3219149
        if (finalScale > 1)
        {
            finalData = new BitmapData(bitmapData.width * finalScale,
                bitmapData.height * finalScale, true, 0);

            if (quality) {
                finalData.drawWithQuality(bitmapData, new Matrix(finalScale, 0, 0,
                    finalScale), null, null, null, true, quality);
            }
            else {
                finalData.draw(bitmapData, new Matrix(finalScale, 0, 0,
                    finalScale), null, null, null, true);
            }

            return finalData;
        }

        var drop:Number = .5;
        var initialScale:Number = finalScale;

        while (initialScale/drop < 1)
            initialScale /= drop;

        var w:Number = Math.floor(bitmapData.width * initialScale);
        var h:Number = Math.floor(bitmapData.height * initialScale);
        var bd:BitmapData = new BitmapData(w, h, bitmapData.transparent, 0);

        if (quality) {
            bd.drawWithQuality(finalData, new Matrix(initialScale, 0, 0, initialScale),
                null, null, null, true, quality);
        }
        else {
            bd.draw(finalData, new Matrix(initialScale, 0, 0, initialScale),
                null, null, null, true);
        }

        finalData = bd;

        for (var scale:Number = initialScale * drop;
            Math.round(scale * 1000) >= Math.round(finalScale * 1000);
            scale *= drop)
        {
            w = Math.floor(bitmapData.width * scale);
            h = Math.floor(bitmapData.height * scale);
            bd = new BitmapData(w, h, bitmapData.transparent, 0);


            if (quality) {
                bd.drawWithQuality(finalData, new Matrix(drop, 0, 0, drop), null, null, null, true, quality);
            }
            else {
                bd.draw(finalData, new Matrix(drop, 0, 0, drop), null, null, null, true);
            }

            finalData.dispose();
            finalData = bd;
        }

        return finalData;
    }

并使用它:

    var bitmapData:BitmapData = resample(sourceBitmapData, desiredWidth, desiredHeight, StageQuality.HIGH_16X16);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM