2013-02-21 2 views
3

Я создаю приложение с ActionScript 3.0 в своем Flash-устройстве. Это следующий вопрос this question.JPEG-кодировщик очень медленный, как его оптимизировать?

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

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? Есть ли способ лучше? заранее спасибо!

~ Myy

+0

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

+0

@GrzegorzAdamHankiewicz В AS3 многопоточность очень новая и еще не поддерживается на мобильных устройствах. –

ответ

0

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

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

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

+1

Алхимия не рекомендуется для мобильных устройств - идеальный ANE – 2013-02-21 20:59:10

+0

Кодирование асинхронно только перемещает проблему производительности. BitmapData.encode() - гораздо лучший способ ускорить кодирование JPEG. –

0

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

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

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

1

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

0

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

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

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

Комментарий здесь, если вам нужно больше деталей.

+0

Теперь я нахожу, что кровавая библиотека SUPER быстро работает на устройствах Android (менее 2 секунд для фотографий, сделанных с разрешением 8 мегапикселей на самом высоком разрешении на устройстве). ОДНАКО - он не работает на iOS.Это заставляет мое приложение зависать, а iOS - для уничтожения программы. –

+0

Это все еще так? Могли ли вы решить проблему с iOS? –

Смежные вопросы