Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Недопустимые данные BitmapData (http://www.flasher.ru/forum/showthread.php?t=122108)

motoroller 02.03.2009 20:47

Недопустимые данные BitmapData
 
Делаю загрущик фото по типу в Контакте:\

Код AS3:

 
        import flash.display.Bitmap;
        import flash.display.Loader;
        import flash.net.FileFilter;
        import flash.net.FileReference;
        import flash.events.MouseEvent;
        import flash.events.Event;
    import fl.events.ListEvent;
        import fl.data.DataProvider;
 
 
// переменные
        var frl:FileReferenceList = new FileReferenceList();
        var currentFile:FileReference;
        var dp:DataProvider = new DataProvider();
        var currentFileNumber:uint;
        var bitmap:Bitmap;
        var totalAllowFiles:uint=50;
        var idFile:uint=0;
// переменные
 
 
        myTileList.setStyle("contentPadding", 5);
        myTileList.setRendererStyle("imagePadding", 10);
        myTileList.dataProvider = dp;
 
        browseButt.addEventListener(MouseEvent.CLICK, browseFiles);
 
 
 
function browseFiles(event:MouseEvent):void {
        currentFileNumber=1;
        var imageTypes = new Array(new FileFilter("Изображения (*.jpg)", "*.jpg"));
    frl.browse(imageTypes); // browse files
        frl.addEventListener(Event.SELECT, onImageSelect);
}
 
function onImageSelect (event : Event):void { // при выборе картинок
        getFile();
}
 
function getFile() : void { // получение каждого файла из frl
        if(currentFileNumber<=frl.fileList.length && totalAllowFiles>0) {
                currentFile = FileReference(frl.fileList[currentFileNumber-1]);
                currentFile.load();
                currentFile.addEventListener(Event.COMPLETE, onDataLoaded);
        }
}
 
function onDataLoaded (event:Event):void { // при загрузке инфы из fr
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
        loader.loadBytes(event.target.data);
}
 
function onImageLoaded(event:Event):void { // доавбление картинкиn в bitmap
    var image:Bitmap = Bitmap(event.target.content);
        event.target.removeEventListener(Event.COMPLETE, onImageLoaded);
        var imageResize:Bitmap=resize(image, 150, 150);
        trace('после ресайз' + idFile);
        dp.addItem({source:imageResize, data:idFile}); // добавляем картинку в myTileList
        if(totalAllowFiles>0) { // груим дальше картинки если они есть в FileReference
                idFile++;
                totalAllowFiles--;
                currentFileNumber++;
                getFile();
        }
}
 
function resize(btm:Bitmap, width:Number, height:Number):Bitmap {
                trace('до ресайз' +  idFile);
                var size:Number = 1;
        var matrix:Matrix;
        var image:BitmapData;
 
            matrix = new Matrix();
            if (btm.width > width || btm.height > height) {
                size = Math.min(width / btm.width, height / btm.height);
                matrix.scale(size, size);
            }
 
                        btm.smoothing = true;
            image = new BitmapData(btm.width * size, btm.height * size, true);
            image.draw(btm, matrix, null, null, null, true);
            return new Bitmap(image, PixelSnapping.AUTO, true);
}

в РАЗНЫХ СИТУАЦИЯ ( ПРИ БОЛЬШИХ ФОТО выдаёт таую ошибку:

ArgumentError: Error #2015: Недопустимые данные BitmapData.
at flash.display::BitmapData()
at upload2_fla::MainTimeline/resize()
at upload2_fla::MainTimeline/onImageLoaded()

ramshteks 02.03.2009 20:50

скорее всего недопустимые данные это слишком большой размер битмапДаты

motoroller 02.03.2009 20:56

Но я же делаю ресайз, картинки перед этим?

Добавлено через 1 минуту
и что никак нельзя это победить?
ну сделано же как-то в контакте и не важно какого размера ты офтки туда грузишь ....

ramshteks 02.03.2009 21:49

посмотри спецификацию битмапдаты повнимательней на предмет ограничений и проследи, какие именно данные поступают в конструктор битмап даты, так ты узреешь истину! :)

motoroller 02.03.2009 22:13

А подскажешь как проследить
делаю trace(btm);

он всё время выводит [object Bitmap]

Добавлено через 6 минут
вот поять примерчик нашёл:
прекрасно работающий

incoob 03.03.2009 13:45

задаются либо слишком большие, либо слишком малые(=0) размеры
поэтому такое исключение и валится

про ограничение на размер bitmap писалось на форуме

TERRORist 03.03.2009 15:18

2880*2880 для FP9
4096*4096 для FP10

motoroller 03.03.2009 15:44

Уважаемые участники форума хочу Вам возразить, мой код загружает фотки с разрешением: 4272*2848
причём в один запус крпограммы он может все фотки прогрузить без проблем, а в лдругой раз споткнуться на 10, а в третий раз споткнуться на 30.
Так что не думаю чт опроблема в этом, плюс, опять же загрущик в контакте не имеет таковых ораничений, я там загружал фотки таких же размеров.

ramshteks 03.03.2009 18:20

не не не!
тут как раз таки такая фишка... загрузить загрузит! и отобразит больших размеров!
но как только ты начинаешь создавать bitmapdatу размеров больше выше изложеных появляется ошибка, уже было такое. послушай нас. проверь какие данные поступают в конструктор битмапдаты

TERRORist 03.03.2009 18:49

Цитата:

Сообщение от motoroller (Сообщение 802659)
Уважаемые участники форума хочу Вам возразить, мой код загружает фотки с разрешением: 4272*2848
причём в один запус крпограммы он может все фотки прогрузить без проблем, а в лдругой раз споткнуться на 10, а в третий раз споткнуться на 30.
Так что не думаю чт опроблема в этом, плюс, опять же загрущик в контакте не имеет таковых ораничений, я там загружал фотки таких же размеров.

4272*2848 сможет сконвертить в битмапдату только FP10. Без проблем предположительно.

http://www.bit-101.com/blog/wp-conte...h10bitmaps.png

motoroller 03.03.2009 22:48

Объясните как проверить данные "проверь какие данные поступают в конструктор битмапдаты" ?
на пальцах

ramshteks 03.03.2009 23:44

боже мой... откуда вы такие беретесь. БИтмап дату мучает а как проверить не знает. В текстфиелд выведи. В трейс? а? круто?

motoroller 04.03.2009 00:07

ну я же писал что в trace выводил
Код AS3:

function resize(btm:Bitmap, width:Number, height:Number):Bitmap {
 
trace(btm);
var size:Number = 1;
        var matrix:Matrix;
        var image:BitmapData;
 
            matrix = new Matrix();
            if (btm.width > width || btm.height > height) {
                size = Math.min(width / btm.width, height / btm.height);
                matrix.scale(size, size);
            }
 
                        btm.smoothing = true;
                if(btm.width==0)
                        image = new BitmapData(btm.width, btm.height, true);
                else
                    image = new BitmapData(btm.width * size, btm.height * size, true);
            image.draw(btm, matrix, null, null, null, true);
            return new Bitmap(image, PixelSnapping.AUTO, true);
}

всегда выводится [object Bitmap]

Добавлено через 41 секунду
trace(btm);

[object Bitmap]
ArgumentError: Error #2015: Недопустимые данные BitmapData.
at flash.display::BitmapData()
at upload2_fla::MainTimeline/resize()
at upload2_fla::MainTimeline/onImageLoaded()

Если не использовать функцию resize, то черные картинки грузятся в tile list, а после скроллинга вообще пропадают.

cleptoman 04.03.2009 00:28

по-моему в конструкторе битмапдаты низзя нолики пихать
Код AS3:

if(btm.width==0)
                        image = new BitmapData(btm.width, btm.height, true);


ramshteks 04.03.2009 00:33

кароч я отваливаю. проблема решается в пять минут. ну я ее так решил когда у меня такое возникло.

motoroller 04.03.2009 15:52

В итоге так никто и не может дать ответ в чём броле загрузок картинок в tileList

ramshteks 04.03.2009 19:26

Код:

trace('до ресайз' +  idFile);
                var size:Number = 1;
        var matrix:Matrix;
        var image:BitmapData;
 
            matrix = new Matrix();
            if (btm.width > width || btm.height > height) {
                size = Math.min(width / btm.width, height / btm.height);
                matrix.scale(size, size);
            }
 
                        btm.smoothing = true;
trace(btm.width * size, btm.height * size);
            image = new BitmapData(btm.width * size, btm.height * size, true);
            image.draw(btm, matrix, null, null, null, true);
            return new Bitmap(image, PixelSnapping.AUTO, true);

смотри что выведет трейс и проследи какие значения будут при ошибке. try catch там и все такое. Раз уж написал загрузчиккаквкантакте то с этим справишся я думаю.

motoroller 05.03.2009 00:57

в том дело, что пока не написал вот пишу.\

Заметил вот что, когда открываешь fla и запускаешь первый раз всё проходит на ура, после второго и последующих запусков идёт ошибка.
Собственно что выдаёт:

до ресайз31
0 0
ArgumentError: Error #2015: Недопустимые данные BitmapData.
at flash.display::BitmapData()
at upload2_fla::MainTimeline/resize()
at upload2_fla::MainTimeline/onImageLoaded()

Соответственно предыдущие 30 отработал нормально, причём файлы все одинакого разрешения.

ramshteks 05.03.2009 01:30

ноль ноль это недопустимые значений

motoroller 05.03.2009 11:36

Конечно что 0 для картинки недопустимое значение, но почему на одной картинке всё отрабатывает, а в другой раз выдаёт ошибку, все же картинки загружаются одинаково, попадают в loader переводятся в bitmapdata

incoob 06.03.2009 12:34

Все очень просто:
на одной картинке всё отрабатывает, так как в качестве аргумента приходит корректная Bitmap(с width и height != 0)
а в другой раз выдаёт ошибку, так как приходит bitmap с width или height == 0

а вот почему приходит кривая битмапа - тут никто не скажет. не телепаты


еще не очень понятно зачем писать заведомо ошибочный код
Код AS3:

                if(btm.width==0)
                        image = new BitmapData(btm.width, btm.height, true);


motoroller 06.03.2009 12:50

Может не все сразу поняли что ошибочные данные приходят в функцию resize

Вопрос почему? В начале топика есть код, как происходит загрузка файла....

Добавлено через 2 часа 2 минуты
Скажи что делать, если фотка более, чем 2880 поэтому битмап дата выдаёт ошибку

alatar 08.03.2009 19:39

если фотка более 2880, необходимо уменьшить фотографию, запихнуть ее в контейнер, и отрисовать контейнер в BitmapData.

Добавлено через 1 минуту
З.Ы. под контейнером имеется ввиду пустой Sprite

motoroller 20.03.2009 12:12

Уважаемый alatar, а подскажите как это сделать?

Shootin 25.03.2009 19:11

а я написал такой загрузчик, который еще данные (все фотографии и настройки) склеивает в одно тело post и шлет на сервак.
так вот у меня была подобная проблема, но решилось.
спокойно хаваются картинки 8191х8191

motoroller 02.07.2009 13:29

Кому надо помочь, всё-таик сделал загрузщик


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

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