Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Мультизагрузка и уменьшение изображение на стороне клиента (http://www.flasher.ru/forum/showthread.php?t=144089)

sqrt 02.09.2010 14:25

Мультизагрузка и уменьшение изображение на стороне клиента
 
Делаю мультизагрузку изображения на сервер.

Не получается реализовать уменьшения изображения. Хочу сделать так, что если фотка больше заданных ширины и высоты, то она уменьшалась до этих размеров. Как я понимаю для этого используется Bitmap.

Помогите решить данную проблему. И как лучше уменьшать изображение? При открытии его или непосредственно перед отправкой.

Вот код

Код AS3:

 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="568" height="300" initialize="init()">
        <mx:List x="10" y="58" width="326" id="photoList" dataProvider="{photos}" itemRenderer="Thumb" verticalScrollPolicy="on" height="218" itemClick="onSel()"></mx:List>
        <mx:Button x="10" y="28" label="Выбрать файлы" id="SelectPhotosButton" click="selectPhotos()"/>
        <mx:Button x="138" y="28" label="Загрузить" id="UploadPhotosButton"/>
        <mx:ProgressBar x="10" y="284" id="photosProgress" mode="manual" labelPlacement="bottom" height="16" minimum="0" maximum="100" indeterminate="false" visible="false"/>
        <mx:Button x="214.5" y="280" label="Отмена" width="72" height="16" id="CancelUpload" visible="false"/>
 
 
 
 
 
        <mx:Script>
        <![CDATA[
 
                import mx.controls.Alert;
                import mx.events.CollectionEvent;
                import flash.net.FileReferenceList;
                import mx.collections.ArrayCollection;
                import flash.net.FileReference;
                import flash.utils.ByteArray;
                import flash.display.Loader;
                import flash.display.Bitmap;
 
 
 
 
 
 
                [Bindable]
                private var photos:ArrayCollection = new ArrayCollection;       
                private var frList:FileReferenceList = new FileReferenceList;
                private var bitmap: Bitmap;
                private static const MAX_WIDTH: Number = 800;
                private static const MAX_HEIGHT: Number = 600;
 
 
                private function init():void
                {
 
 
                        frList.addEventListener(Event.SELECT,onFileSelected);
                }
 
 
                private function selectPhotos():void
                {
                        var fileFilter:FileFilter = new FileFilter("Изображения jpeg","*.jpg;*.jpeg");
                        frList.browse([fileFilter]);
 
                }
 
                public function onFileSelected(evt:Event):void
        {
 
 
            for (var i:uint = 0; i < frList.fileList.length; i++)
                        {
                                var elem:Object = new Object;
                                elem.fr = FileReference(frList.fileList[i]);
                                elem.fr.addEventListener(ProgressEvent.PROGRESS, onProgress);
                    elem.fr.load();
                    elem.fr.addEventListener(Event.COMPLETE, onComplete);
 
                                photos.addItem(elem);
                        }
 
        }
                public function onProgress(evt:ProgressEvent):void
        {
          photosProgress.visible=true;
          var numPerc:Number = Math.round((Number(evt.bytesLoaded) / Number(evt.bytesTotal)) * 100);
          photosProgress.setProgress(numPerc,100);
          photosProgress.validateNow();
 
        }
        public function onComplete(evt:Event):void
        {
            photoList.invalidateList();
 
        }
 
 
                private function resizeBitmap( target : Bitmap ) : void
                {
                        if ( target.height < target.width ) {
                                target.width = MAX_WIDTH;
                                target.scaleY = target.scaleX;
                        } else if ( target.width <= target.height ) {
                                target.height = MAX_HEIGHT;
                                target.scaleX = target.scaleY;
                        }
 
                }
 
                ]]>
</mx:Script>
        <mx:Label x="173" y="0" text="Загрузка фотографии" fontWeight="bold" fontSize="12" textAlign="center"/>
 
 
 
 
 
</mx:Application>


nOobCrafter 06.09.2010 15:28

sqrt я делаю сразу же при загрузке и потом с этим изображением работаю далее.
Как то так:
Код AS3:

                private function makeValidBitmapData($bitmapData:BitmapData):BitmapData                                                // тут ужимаем нашу битмапу до нужных размеров для передачи и отдаем новую
                {
                        if ($bitmapData.width <= ApplicationData.BIG_PIC_SIZE && $bitmapData.height <= ApplicationData.BIG_PIC_SIZE)
                                return $bitmapData.clone();                                                                                                                        // если фото итак подходит, то возвращем его же
                        var myMatrix        :Matrix = new Matrix();                                                                                                        // матрица преобразований, будим крутить и перемещать фотку
                        var coefW                :Number = ApplicationData.BIG_PIC_SIZE / $bitmapData.width;                       
                        var coefH                :Number = ApplicationData.BIG_PIC_SIZE / $bitmapData.height;
                        var multiplier        :Number;
                        if (coefW > coefH)        { multiplier = coefH; }                                                                                          // если фотка горизонтальная
                        else                                { multiplier = coefW; }                                                                                                // если вертикальная или квдарат)
 
                        myMatrix.createBox(multiplier, multiplier, 0, 0, 0);//scaleX,scaleY,rotation,x,y вот интересная фишка!!
 
                        var newBitmapData:BitmapData = new BitmapData(multiplier * $bitmapData.width, multiplier * $bitmapData.height, true, 0xFFFFFF);// делаем новую битмапу, сюда срисуем все
                                newBitmapData.draw($bitmapData, myMatrix , null, null, null, true);                                        // срисовываем
 
 
                        return newBitmapData;
                }



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

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