Изменение размера изображений в Flex с использованием as3 - PullRequest
1 голос
/ 08 июля 2011

Я загружаю изображение с помощью загрузчика. После загрузки я могу получить растровые данные, используя Bitmap(event.target.loader.content).bitmapData.

Однако, поскольку загружаемые мной изображения достаточно велики (около 2000 x 1600), я хотел бы уменьшить размер и создать новое более мелкое растровое изображение, возможно, шириной 200 или 300 пикселей, что-то вроде миниатюры.

Я думаю, что это связано с созданием нового BitmapData с новым размером. Однако я не могу заставить это работать должным образом.

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 08 июля 2011

Не проверено, но это должно дать вам представление:

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;
}
2 голосов
/ 12 января 2013

Вы также можете использовать этот код из класса BitmapImage.Я обновил его для поддержки метода drawWithQuality класса BitmapData.Значения см. В классе StageQuality.

Примечание. Чтобы использовать API качества, вам нужно установить версию SWF как минимум на 16.Однако компилятор, похоже, не выдает ошибку в любом случае.

    /**
     * @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);
...