Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ресайз изображения (http://www.flasher.ru/forum/showthread.php?t=200085)

Makkssimka 30.05.2013 00:28

Ресайз изображения
 
Доброго времени суток! Помогите разобраться, я получаю изображение в виде ByteArray, мне нужно сделать его ресайз, нашел пример как это делается через BitmapData, сделал следующую функцию:
Код AS3:

function resize(images:ByteArray, h:int, w:int):ByteArray{
        var loader:Loader = new Loader();
        var newImg:BitmapData = new BitmapData(w, h);
        loader.loadBytes(images);
        newImg.draw(loader);
        var newJpeg:ByteArray = new JPEGEncoder(90).encode(newImg);
        return newJpeg;
}

И вызвал ее:
Код AS3:

var image:ByteArray = imgList[i].img;
var img:ByteArray = resize(image, 200, 200);

Итог белый квадрат 200X200! Вы меня конечно извините может я что-то криво написал (я с AS на ВЫ), помогите разобраться где ошибки!

maincode 30.05.2013 00:39

Прежде чем делать draw, необходимо дождаться окончания загрузки loader

yasha005 30.05.2013 00:44

Ресайз изображения:
Код AS3:

package
{
        import flash.display.BitmapData;
        import flash.geom.Matrix;
 
        public class BitmapResize
        {
                private static const IDEAL_RESIZE_PERCENT:Number = .5;
 
                public function BitmapResize()
                {
 
                }
 
 
 
public static function resizeImage(source:BitmapData, width:Number, height:Number, constrainProportions:Boolean = true):BitmapData
{
    var scaleX:Number = width/source.width;
    var scaleY:Number = height/source.height;
    if (constrainProportions) {
        if (scaleX > scaleY) scaleX = scaleY;
        else scaleY = scaleX;
    }
 
    var bitmapData:BitmapData = source;
 
    if (scaleX >= 1 && scaleY >= 1) {
        bitmapData = new BitmapData(Math.ceil(source.width*scaleX), Math.ceil(source.height*scaleY), true, 0);
        bitmapData.draw(source, new Matrix(scaleX, 0, 0, scaleY), null, null, null, true);
        return bitmapData;
    }
 
    // scale it by the IDEAL for best quality
    var nextScaleX:Number = scaleX;
    var nextScaleY:Number = scaleY;
    while (nextScaleX < 1) nextScaleX /= IDEAL_RESIZE_PERCENT;
    while (nextScaleY < 1) nextScaleY /= IDEAL_RESIZE_PERCENT;
 
    if (scaleX < IDEAL_RESIZE_PERCENT) nextScaleX *= IDEAL_RESIZE_PERCENT;
    if (scaleY < IDEAL_RESIZE_PERCENT) nextScaleY *= IDEAL_RESIZE_PERCENT;
 
    var temp:BitmapData = new BitmapData(bitmapData.width*nextScaleX, bitmapData.height*nextScaleY, true, 0);
    temp.draw(bitmapData, new Matrix(nextScaleX, 0, 0, nextScaleY), null, null, null, true);
    bitmapData = temp;
 
    nextScaleX *= IDEAL_RESIZE_PERCENT;
    nextScaleY *= IDEAL_RESIZE_PERCENT;
 
    while (nextScaleX >= scaleX || nextScaleY >= scaleY) {
        var actualScaleX:Number = nextScaleX >= scaleX ? IDEAL_RESIZE_PERCENT : 1;
        var actualScaleY:Number = nextScaleY >= scaleY ? IDEAL_RESIZE_PERCENT : 1;
        temp = new BitmapData(bitmapData.width*actualScaleX, bitmapData.height*actualScaleY, true, 0);
        temp.draw(bitmapData, new Matrix(actualScaleX, 0, 0, actualScaleY), null, null, null, true);
        bitmapData.dispose();
        nextScaleX *= IDEAL_RESIZE_PERCENT;
        nextScaleY *= IDEAL_RESIZE_PERCENT;
        bitmapData = temp;
    }
 
    return bitmapData;
}
 
 
 
        }
}


WisP 30.05.2013 00:47

На лоадер нужно слушатель повесить и вытаскивать изображение через параметр content лоадера.
Код AS3:

var loader:Loader;
var image:ByteArray = imgList[i].img;
var newImg:BitmapData = new BitmapData(w, h);
var img:ByteArray;
resize(image);
 
function resize(images:ByteArray):ByteArray
{
        loader = new Loader();
        loader.addEventListener(Event.COMPLETE, onLoaderComplete);
        loader.loadBytes(images);
}
function onLoaderComplete(event:Event):void
{
        newImg.draw(loader.content as Bitmap);
        img = new JPEGEncoder(90).encode(newImg);
}

Код не проверял, но смысл должен быть ясен.

Makkssimka 30.05.2013 16:11

WisP, Функция onLoaderComplete не выполняется?

Wolsh 30.05.2013 17:19

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);

Makkssimka 30.05.2013 18:09

trace(img) возвращает null

Final Hope 30.05.2013 18:18

Вы же загружаете ByteArray, кажется? А потом вдруг делаете loader.content as Bitmap. Так, кажется, нельзя. Нет?

Makkssimka 30.05.2013 18:21

Вот таким образом:

Код AS3:

var loadIm:Loader;
                                        resizIm(image);
 
                                        function resizIm(im:ByteArray):void{
                                                loadIm = new Loader();
                                                loadIm.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
                                                loadIm.loadBytes(im);
                                        }
 
                                        function onLoaderComplete(event:Event):void{
                                                var newImg:BitmapData = new BitmapData(200, 200);
                                                var img:ByteArray;
                                                newImg.draw(loadIm.content as Bitmap);
                                                img = new JPEGEncoder(90).encode(newImg);
                                                trace (img);
                                        }

trace выводит все нормально, но как img достать из функции?

Wolsh 30.05.2013 19:46

Вызвать функцию, которая должна с ним работать, из того места в то ВРЕМЯ, когда он точно есть, то есть из onLoaderComplete.


Часовой пояс GMT +4, время: 14:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.