2014-12-04 2 views
0

Шаги моего приложение выполняет: -изображения становится неузнаваемо

  1. Скачать большое ЧИСЛО изображений и сохранять их на SDCard.
  2. Загрузите каждое изображение в растровое изображение и измените его размер, после изменения размера замените это измененное изображение на оригинальное.

Мой код: -

Bitmap myimage = loadimage(path+temppos+".jpg"); 
Bitmap finalimage = getResizedBitmap(myimage,width,height); 
//save image 
..... 
//recyclebitmap 
myimage.recycle(); 
finalimage.recycle(); 

LoadImage: -

public Bitmap loadimage(String path) 
    { 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPreferredConfig = Bitmap.Config.RGB_565; 
     options.inDither=true; 
     options.inPurgeable=true; 
     options.inInputShareable=true; 
     return BitmapFactory.decodeFile(path, options); 
    } 

Теперь я заселять эти изображения на GridView.

Выход (до): - enter image description here

Output (After): - enter image description here

Где Before соответствует первоначально, когда только несколько изображений загружаются. И After соответствует после загрузки всех изображений.

Теперь, я думаю, что это происходит из-за метода Bitmap.recycle(), но не знаю причины. Пожалуйста, поправьте меня, если я ошибаюсь и укажу здесь на ошибку.

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

Спасибо.

+0

не могли бы вы попробовать 'options.inSampleSize = 3' перед' decodeFile'. возможно, у вас проблема с памятью. – BzH

+0

JPEG - формат сжатия ** LOSSY **. Каждый раз, когда вы сохраняете изображение, оно ** теряет детали **. Также это: 'options.inPreferredConfig = Bitmap.Config.RGB_565; '** снижает доступные цвета ** (16 бит). –

+0

@HBizhi Пробовал. Получение той же проблемы. Я проверил загруженные изображения, и первые 3 изображения неузнаваем. Они сохраняются, поскольку они отображаются на выходе. – Mohit

ответ

0

Для получения измененных размеров растрового изображения вы можете использовать следующий код: (взятый из this учебника)

public static Bitmap decodeSampledBitmapFromPath(String path, int reqWidth, 
      int reqHeight) { 

     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(path, options); 

     options.inSampleSize = calculateInSampleSize(options, reqWidth, 
       reqHeight); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     Bitmap bmp = BitmapFactory.decodeFile(path, options); 
     return bmp; 
     } 

    public static int calculateInSampleSize(BitmapFactory.Options options, 
      int reqWidth, int reqHeight) { 

     final int height = options.outHeight; 
     final int width = options.outWidth; 
     int inSampleSize = 1; 

     if (height > reqHeight || width > reqWidth) { 
      if (width > height) { 
       inSampleSize = Math.round((float) height/(float) reqHeight); 
      } else { 
       inSampleSize = Math.round((float) width/(float) reqWidth); 
      } 
     } 
     return inSampleSize; 
     } 

Вы также можете посмотреть на official site для получения намека на погрузочных Bitmaps

Редактировать

Попробуйте изменить конфигурацию растрового изображения ARGB_8888 для наилучшего качества

, потому что конфигурация RGB_565 может производить небольшие визуальные артефакты, в зависимости от конфигурации источника (из docs)

Update

Я думаю, вы посмотрите на this answer может, я думаю, что это будет решать ваши проблема

+0

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

+0

@Mohit Я отредактировал свой ответ, посмотрим, работает ли он –

+0

Пробовал, никаких изменений. Я думаю, проблема связана с неправильной обработкой метода bitmap.recycle() ' – Mohit

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