Android调整大图像接收为base64字符串

时间:2014-12-11 06:24:17

标签: android image base64 bitmapfactory

我有一些问题在android中调整图像大小。 我有一个base64字符串(我没有文件或网址,只有字符串),到目前为止,我尝试解码它时,我得到一个内存不足的异常。

public String resizeBase64Image(String base64image){

    byte [] encodeByte=Base64.decode(base64image,Base64.DEFAULT); //out of memory exception...

    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inPurgeable = true;
    Bitmap image = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length,options);

    image = Bitmap.createScaledBitmap(image, IMG_WIDTH, IMG_HEIGHT, false);

    ByteArrayOutputStream baos=new  ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.PNG,100, baos);
    byte [] newbytes=baos.toByteArray();

    return Base64.encodeToString(newbytes, Base64.DEFAULT);

}

有人有想法吗?

3 个答案:

答案 0 :(得分:5)

我花了一段时间才回到这个项目,但我终于找到了解决问题的方法。 首先,我需要修改Manfest的应用程序标签以添加largeHeap =:true“:

`<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:largeHeap="true" >`

利用垃圾收集器有很多帮助。

public String resizeBase64Image(String base64image){
    byte [] encodeByte=Base64.decode(base64image.getBytes(),Base64.DEFAULT); 
    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inPurgeable = true;
    Bitmap image = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length,options);


    if(image.getHeight() <= 400 && image.getWidth() <= 400){
        return base64image;
    }
    image = Bitmap.createScaledBitmap(image, IMG_WIDTH, IMG_HEIGHT, false);

    ByteArrayOutputStream baos=new  ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.PNG,100, baos);

    byte [] b=baos.toByteArray();
    System.gc();
    return Base64.encodeToString(b, Base64.NO_WRAP);

}   

答案 1 :(得分:0)

对于OutOfMemoryError,下面的代码可能会有所帮助。

public String BitMapToString(Bitmap bitmap){
        ByteArrayOutputStream baos=new  ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100, baos);
        byte [] b=baos.toByteArray();
        String temp=null;
        try{
        System.gc();
        temp=Base64.encodeToString(b, Base64.DEFAULT);
        }catch(Exception e){
            e.printStackTrace();
        }catch(OutOfMemoryError e){
            baos=new  ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG,50, baos);
            b=baos.toByteArray();
            temp=Base64.encodeToString(b, Base64.DEFAULT);
            Log.e("EWN", "Out of memory error catched");
        }
        return temp;
  }

基本上我所做的是:我捕获OutofMemoryError并在该catch块中将其调整大小50%然后我将其编码为字符串。

答案 2 :(得分:0)

试试这个。

options.inSampleSize = 2;