java.lang.outofmemoryerror 位图大小超出位图上的 vm 预算

Posted

技术标签:

【中文标题】java.lang.outofmemoryerror 位图大小超出位图上的 vm 预算【英文标题】:java.lang.outofmemoryerror bitmap size exceeds vm budget on bitmap 【发布时间】:2011-11-16 01:50:53 【问题描述】:

在我的应用程序中,我正在显示来自厨房的图像,并且在选择图像时,我想将该图像上传到 Web 服务器。为了将图像上传到服务器,我正在使用以下代码,但出现错误 bitmapImage = BitmapFactory.decodeFile(path,opt);

private void uploadImage(String selectedImagePath) 
        String str = null;
        byte[] data = null;
        String  Responce= null;
        Bitmap bitmap2 = null;
        try 
            File file=new File(selectedImagePath);
            //FileInputStream fileInputStream = new FileInputStream(new File(imagePath2) );
            FileInputStream fileInputStream=new FileInputStream(selectedImagePath);
            Log.i("Image path 2",""+selectedImagePath+"\n"+fileInputStream);
            name=file.getName();
            name=name.replace(".jpg","");
            name=name.concat(sDate).concat(".jpg");
            Log.e("debug",""+name);

            //else
            //
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inTempStorage = new byte[16*1024];

            //bitmapImage = BitmapFactory.decodeFile(path,opt);

            bitmap2=BitmapFactory.decodeFileDescriptor(fd, outPadding, opts)
            Log.i("Bitmap",""+bitmap.toString());
            BitmapFactory.decodeStream(fileInputStream);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap2.compress(Bitmap.CompressFormat.PNG, 100, baos);
            data = baos.toByteArray();
            str=Base64.encodeBytes(data);
            //

            //String image=str.concat(sDate);
            ArrayList<NameValuePair> nameValuePairs = new
            ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("image",str));
            nameValuePairs.add(new BasicNameValuePair("imagename", name));
            Log.e("debug",""+nameValuePairs.toString());

            HttpClient client=new DefaultHttpClient();
            HttpPost post=new HttpPost("http://ufindfish.b4live.com/uploadTipImage.php");

            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            HttpResponse httpResponse=client.execute(post);
            HttpEntity entity=httpResponse.getEntity();
            InputStream inputStream=entity.getContent();

            StringBuffer builder=new StringBuffer();
            int ch;
            while( ( ch = inputStream.read() ) != -1 )
            
                builder.append((char)ch);
            
            String s=builder.toString();
            Log.i("Response",""+s);



         catch (FileNotFoundException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (UnsupportedEncodingException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (ClientProtocolException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (IllegalStateException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        if(bitmap2!=null)
        
            bitmap2.recycle();
        

【问题讨论】:

【参考方案1】:

错误是由于图像的大小,我在从图库中选择时使用此代码减小图像的大小。

public Bitmap setImageToImageView(String filePath) 
     
    // Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(filePath, o); 

    // The new size we want to scale to 
    final int REQUIRED_SIZE = 1024; 

    // Find the correct scale value. It should be the power of 2. 
    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
    int scale = 1; 
    while (true) 
     
    if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) 
    break; 
    width_tmp /= 2; 
    height_tmp /= 2; 
    scale *= 2; 
     

    // Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    Bitmap bitmap = BitmapFactory.decodeFile(filePath, o2); 
    return bitmap;

    

希望对你有帮助。

【讨论】:

@abhi...感谢您的回复..但我仍然收到错误..1 个小问题...在获取位图后,即 **Bitmap bitmap = Bitmap Factory.decode File(file路径,o2); ** 在此之后你如何将其转换为 base 64 字符串...我为此 bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 使用以下代码数据 = baos.toByteArray(); str=Base64.encodeBytes(数据); @abhi...谢谢我已经解决了这个问题...现在它工作正常...非常感谢您... @Abhi 我使用了你的代码,它几乎解决了我的错误,但由于这种方法,我遇到了一个问题。这种方法正在旋转我的原始图像。而我不想要的。我想像在画廊中一样显示我的图像。有没有办法做到这一点? 嗨@anddev 上面的函数中没有旋转图像的代码,它只会缩放图像。在你的最后检查 @Abhi 感谢您的快速回复,但我从最后使用不同的方法进行了检查,但仍有一些图像会旋转并显示到 imageview 中。所以问题不在于我的错误上面的代码。我对此感到抱歉。但是现在你能建议我解决我的问题的正确方法吗?谢谢【参考方案2】:

你必须在加载图像时闯入样本,已经有一个问题和一个很好的答案,看看这个页面,这可能会对你有所帮助。

Strange out of memory issue while loading an image to a Bitmap object

【讨论】:

以上是关于java.lang.outofmemoryerror 位图大小超出位图上的 vm 预算的主要内容,如果未能解决你的问题,请参考以下文章