2014-10-04 3 views
0

после многопользовательской игры Я еще не нашел способ изменить размер изображения, сохраняя качество.Изменить размер изображения на Android

У меня есть изображение - хранится камерой в полном разрешении - в

String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/my_directory/my_file_name.jpg"; 

Теперь мне нужно изменить его размер с сохранением соотношения сторон, а затем сохранить на другой путь.

Каков наилучший способ сделать это без возникновения ошибки? Недостаточно памяти при распределении xxxxxxx-байта. "?

Я продолжаю извлекать эту ошибку на устройствах Samsung, я старался изо всех сил, даже с библиотекой Picasso.

Спасибо!

+1

Технически говоря, сокращение размера растрового изображения всегда будет снижать качество, так как меньше пикселей для хранения данных. – Jave

ответ

0

1st things 1st: в зависимости от устройства и размера растрового изображения, независимо от того, какой волшебный код вы делаете, он сработает! Специально дешевые телефоны Samsung, которые обычно имеют не более 16 МБ ОЗУ для виртуальной машины.

Вы можете использовать этот код How to get current memory usage in android?, чтобы проверить доступность доступной памяти и поработать с ней должным образом.

При выполнении этих вычислений помните, что растровые изображения несжатых изображений, это означает, что даже JPG может быть 100 КБ, битмап может занять несколько МБ.

Вы должны использовать приведенный здесь код https://developer.android.com/training/displaying-bitmaps/load-bitmap.html, чтобы прочитать границы растрового изображения, и сделать приблизительный масштаб вниз как можно ближе к размеру, который вам действительно нужен, или достаточно, чтобы устройство не вышло из строя. Вот почему важно правильно измерить память.

Этот 1-й код практически не имеет ОЗУ, поскольку он создает с диска, что уменьшает его, просто пропуская пиксели с изображения. Вот почему он приблизительный, он только имеет силу 2 масштабирования.

Тогда вы будете использовать стандартный API для масштабирования до размера вы на самом деле нужно https://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap(android.graphics.Bitmap, Int, Int, логическое)

поэтому псевдо-код для него, будет:

try{ 
    Info info = getImageInfo(File); 
    int power2scale = calculateScale(info, w, h); 
    Bitmap smaller = preScaleFromDisk(File, power2scale); 
    Bitmap bitmap = Bitmap.createScaledBitmap(smaller, w, h, f); 
} catch(OutOfMemoryError ooe){ 
    // call GC 
    // sleep to let GC run 
    // try again with higher power2scale 
} 
Смежные вопросы