2014-01-31 3 views
1

Я использую кодировку Base64 для преобразования изображения, а затем создаю его на Windows Server.

Он работает нормально на большинстве устройств, но он дает ошибку java.lang.OutOfMemoryError в android Version 2.3.5. Я пробовал android:largeHeap="true", но он не работает.

Android Код:java.lang.OutOfMemoryError: (Размер кучи = 17863 КБ, выделенный = 11272 КБ, размер растрового изображения = 12444 КБ)

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); 
Bitmap bitmap = drawable.getBitmap(); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
byte[] data = baos.toByteArray(); 

strBase64 = Base64.encodeToString(data, Base64.DEFAULT); 


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

Мой код в asp.net:

public System.Drawing.Image Base64ToImage(string base64String) 
    { 
     byte[] imageBytes = Convert.FromBase64String(base64String); 
     using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length)) 
     { 
      ms.Write(imageBytes, 0, imageBytes.Length); 
      System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true); 
      return image; 
     } 
    } 
System.Drawing.Image convertedImage = Base64ToImage(Photo); 
convertedImage.Save(Server.MapPath("~\\images\\profileImg\\jeeten.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg); 

Я попробовал некоторые обрезку коды изображения, но он дал ошибку: Произошла общая ошибка в GDI +.

+0

* андроида: largeHeap = "истинный" * является intruduced с ** Honeycomb ** API 3,0 –

+0

Может быть, добавить в Android код вместо поскольку ошибка на его стороне? – Migol

+0

@ Migol проверить обновленный пост для Android-кода. –

ответ

1

Я хотел бы сделать эти изменения:

  • Вместо того, чтобы изображение из ImageView, рассмотреть возможность использования его первоисточник (файловая система актив?). Тогда вам не нужно повторно сжимать изображение.
  • Не сжимайте JPG со 100% качеством. Большие затраты на получение незавидного качества изображения очень велики. Если вам нужно 100%, используйте PNG, иначе используйте качественный JPG на 85%.
  • У вас есть несколько копий изображения в памяти - в drawable, в вашем массиве байтов, в вашей базовой строке 64 и т. Д. Вы можете устранить некоторые из них.
  • Зачем конвертировать в базу 64? Просто отправьте байты на сервер. Вот example с использованием PHP, но в .NET используйте HttpPostedFile для его получения.
+0

Благодарим вас за ценный ответ. Я собираюсь проверить это шаг за шагом, тогда я буду отмечать это как ответ. –

+0

Как проходит ваше расследование? –

+0

Я изменяю сжимаю PNG на 100%, а затем использую метод обрезки. Это решило мою проблему. –

0
Before Compressing the bitmap you can follow this: 

//Put your image in file. 
File file = new File("/mnt/sdcard/image.jpg"); 

//Pass your file in decodeImage method (your file, with its width and height as you want to display) 
Bitmap bitmapImg=decodeImage(file,100,100); 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
       bitmapImg.compress(Bitmap.CompressFormat.JPEG, 100, stream); 

       byte[] byteArray = stream.toByteArray(); 

       String encodedString = Base64.encodeToString(byteArray, Base64.DEFAULT); 



//Body of decodeFile(File f,int WIDTH,int HIGHT) 

public Bitmap decodeFile(File f,int WIDTH,int HIGHT) 
     { 
      try { 
       //Decode image size 
       BitmapFactory.Options o = new BitmapFactory.Options(); 
       o.inJustDecodeBounds = true; 
       BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

       //The new size we want to scale to 
       final int REQUIRED_WIDTH=WIDTH; 
       final int REQUIRED_HIGHT=HIGHT; 
       //Find the correct scale value. It should be the power of 2. 
       int scale=1; 
       while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT) 
        scale*=2; 

       //Decode with inSampleSize 
       BitmapFactory.Options o2 = new BitmapFactory.Options(); 
       o2.inSampleSize=scale; 
       b1= BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 

      } catch (Exception e) {} 
      return b1; 
     } 
Смежные вопросы