java.lang.OutOfMemoryError :(堆大小= 17863KB,分配= 11272KB,位图大小= 12444KB)

时间:2014-01-31 11:01:23

标签: android asp.net bitmap

我正在使用Base64编码字符串转换图像,然后在Windows Server上创建它。

它在大多数设备中工作正常,但它在android版本2.3.5中给出错误java.lang.OutOfMemoryError。我试过了android:largeHeap="true"但它无法正常工作。

Android代码:

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 +中发生了一般错误。

2 个答案:

答案 0 :(得分:1)

我会做出这些改变:

  • 不考虑从ImageView获取图像,而是考虑使用它的原始源(文件系统?资产?)。然后你不必重新压缩图像。
  • 请勿以100%的质量压缩JPG。图像质量不明显的成本很高。如果您需要100%,请使用PNG,否则使用85%质量的JPG。
  • 您在内存中有多个图像副本 - 在drawable中,在您的字节数组中,在基本64字符串中等等。您可以消除其中的一些副本。
  • 为什么要转换为64?只需将字节发送到服务器 - 这是使用PHP的example,但在.NET中使用HttpPostedFile来接收它。

答案 1 :(得分: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;
         }