我想从图库中加载图片,然后将其转换为base64。
这听起来并不那么困难。所以我这样说道:
首先打开图库并选择图片:
picteureBtn.setOnClickListener(new View.OnClickListener() {
private Uri imageUri;
public void onClick(View view) {
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
}
});
第二次onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
picturePath = cursor.getString(columnIndex);
cursor.close();
}
}
以及我希望解码位于image
picutrePath
的最终方式
String b64;
StringEntity se;
String entityContents="";
if (!picturePath.equals("")){
Bitmap bm = BitmapFactory.decodeFile(picturePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
b64=Base64.encodeToString(b, Base64.DEFAULT);
}
不幸的是我得到了:
06-24 16:38:14.296: E/AndroidRuntime(3538): FATAL EXCEPTION: main
06-24 16:38:14.296: E/AndroidRuntime(3538): java.lang.OutOfMemoryError
06-24 16:38:14.296: E/AndroidRuntime(3538): at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)
有人能指出我在哪里做错了吗?
答案 0 :(得分:5)
我建议改变
Bitmap bm = BitmapFactory.decodeFile(picturePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
//added lines
bm.recycle();
bm = null;
//added lines
byte[] b = baos.toByteArray();
b64=Base64.encodeToString(b, Base64.DEFAULT);
这样,您就不会将Bitmap两次加载到应用程序的内存中。
答案 1 :(得分:3)
有很多文章在讨论这个问题,基本上你需要先计算尺寸,然后再尝试将其解码为Bitmap
,看看BitmapFactory
类。我有一个替代解决方案,因为您从图库中选择了一张图片,您可以在Bitmap
中获取activityForResult
,如下所示:
Bitmap image = (Bitmap) data.getExtras().get("data");
您可以启动Intent
来获取图像:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, RESULT_LOAD_IMAGE);