2014-01-31 78 views
1

我使用Base64編碼字符串轉換圖像,然後在Windows Server上創建它。

它在大多數設備上工作正常,但它在android版本2.3.5中給出錯誤java.lang.OutOfMemoryError。我試過android:largeHeap="true",但它沒有工作。

的Android代碼:java.lang.OutOfMemoryError :(堆大小= 17863KB,分配的= 11272KB,位圖大小= 12444KB)

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); 


我想給裁剪圖像選項的用戶,然後將其保存在Windows服務器。有沒有什麼容易和更好的方法呢?

我在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有** **蜂窩API 3.0 –

+0

也許添加Android的代碼,而不是因爲錯誤是在它的身邊? – Migol

+0

@Molol檢查更新後的Android代碼。 –

回答

1

我會做這些改變:

  • 而不是從ImageView的獲取圖像,可以考慮使用它的原始源(文件系統資產?)。然後你不必重新壓縮圖像。
  • 請勿以100%質量壓縮JPG。不明顯的圖像質量收益有很大的成本。如果你需要100%,使用PNG,否則使用85%質量的JPG。
  • 你在內存中有幾個圖像拷貝 - 在drawable中,在你的字節數組中,在你的base 64字符串中,等等。你可以刪除其中的一些。
  • 爲什麼要轉換爲基礎64?只需發送字節到服務器 - 這是使用PHP的example,但在.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; 
     } 
相關問題