Кодировщик JPEG очень медленный, как его оптимизировать?

Я создаю приложение с помощью ActionScript 3.0 в моем Flash Builder. Это дополнительный вопрос этот вопрос< /а>.

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

var jpgenc:JPEGEncoder = new JPEGEncoder(50);
trace('encode');
//encode the bitmapdata object and keep the encoded ByteArray

    var imgByteArray:ByteArray = jpgenc.encode(bitmap);
temp2 = File.applicationStorageDirectory.resolvePath("snapshot.jpg");
    var fs:FileStream = new FileStream();
    trace('fs');
    try{     
     //open file in write mode     
     fs.open(temp2,FileMode.WRITE);
          //write bytes from the byte array

     fs.writeBytes(imgByteArray);
          //close the file

     fs.close();
         }catch(e:Error){

Есть ли другой способ преобразовать его в byteArray? Есть ли способ лучше? заранее спасибо!

~ Мой


person Myy    schedule 21.02.2013    source источник
comment
Независимо от производительности кода, почему вы не запускаете работу в фоновом потоке вместе с загрузкой? Если вы не можете ограничить размер входного изображения, вы всегда найдете пользователей, которые выбирают большие изображения и им не понравится неотзывчивое приложение.   -  person Grzegorz Adam Hankiewicz    schedule 21.02.2013
comment
@GrzegorzAdamHankiewicz В AS3 многопоточность очень новая и еще не поддерживается на мобильных устройствах.   -  person Michael Brewer-Davis    schedule 22.02.2013


Ответы (5)


Попробуйте использовать библиотеку blooddy: http://www.blooddy.by. Но я не тестировал его на мобильных устройствах. Комментарий, если вы будете иметь успех.

person Ilya Zaytsev    schedule 22.02.2013

Используйте BitmapData.encode(), это на порядок быстрее на мобильных устройствах http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#encode%28%29

person matthias_buehlmann    schedule 12.10.2013
comment
BitmapData.encode() — это такое огромное улучшение по сравнению с JPEGEncoder, что это почти комично. - person Ori Pessach; 28.05.2015

Вы должны попытаться найти кодировщик JPEG, способный кодировать асинхронно. Таким образом, приложение можно будет использовать во время сжатия изображения. Я не пробовал ни одну из библиотек, но эта выглядит многообещающе:

http://segfaultlabs.com/devlogs/alchemy-asynchronous-jpeg-encoding-2

Он использует Alchemy, что должно сделать его быстрее, чем JPEGEncoder из as3corelib (который, я думаю, является вы используете в данный момент.)

person david.emilsson    schedule 21.02.2013
comment
Алхимия не рекомендуется для мобильных устройств — идеально подойдет ANE. - person ; 22.02.2013
comment
Асинхронное кодирование только перемещает проблему производительности. BitmapData.encode() — гораздо лучший способ ускорить кодирование JPEG. - person Ori Pessach; 28.05.2015

Родной кодировщик JPEG идеален, асинхронный был бы хорош, но, возможно, все еще медленный (просто не блокирующий). Другой вариант:

var pixels:ByteArray = bitmapData.getPixels(bitmapData.rect);
pixels.compress();

Я не уверен в собственной производительности, а производительность определенно зависит от того, какие у вас есть изображения.

person Michael Brewer-Davis    schedule 21.02.2013

Ответ от Ильи был то, что сделал это для меня. Я скачал библиотеку и внутри есть пример как ее использовать. Я работал над тем, чтобы CameraUI в flashbuilder делал снимок, кодировал/сжимал его, а затем отправлял через веб-службу на мой сервер (данные были отправлены в виде сжатого массива байтов). Я сделал это:

by.blooddy.crypto.image.JPEGEncoder.encode(bmp, 30);

Где bmp — мои растровые данные. Кодирование заняло менее 3 секунд и легко синхронизировалось с моим потоком управления. Я пробовал асинхронные методы, но в конечном итоге они заняли очень много времени, и их было трудно отследить, например, когда пользователь переходил с сотовой связи на Wi-Fi или с башни на башню во время загрузки.

Прокомментируйте здесь, если вам нужна дополнительная информация.

person Jesse Rallo    schedule 23.04.2013
comment
Теперь я обнаружил, что кровавая библиотека работает СУПЕР быстро на устройствах Android (менее 2 секунд для фотографий, сделанных с разрешением 8 мегапикселей при самом высоком разрешении на устройстве). ОДНАКО - это НЕ работает на iOS. Это заставляет мое приложение зависать, а iOS убивает программу. - person Jesse Rallo; 26.04.2013
comment
Это все еще так? Удалось решить для iOS? - person Tom Auger; 08.10.2015