我正在服务器上传高分辨率和大图像。 我正在使用接受Base64转换字符串中的图像的API。 我正在将Image转换为Base64字符串并上传到服务器,但如果Image很大,那么它会提供OutOfMemory Exception。 任何人都可以建议我如何解决这个问题。
这是我在Base64编码字符串中将myBitmap(Bitmap to upoload)转换为在服务器上发送的函数。 我不想压缩图片。
if(myBitmap!=null){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] b = baos.toByteArray();
// I am passing encodedImg as image parameter.
String encodedImg = new String(Base64.encodeBase64(b));
try{
baos.close();
baos = null;
b = null;
}
catch (Exception e) {
e.printStackTrace();
}
}
// Below code is to open camera/gallery to select Image
btnCamera.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String fileName = "profile.jpg";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera");
imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 3);
intent.putExtra("aspectY", 4);
intent.putExtra("outputX", 480);
intent.putExtra("outputY", 640);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection",true);
startActivityForResult(intent, 1);
a.dismiss();
}
});
btnGalary.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 3);
intent.putExtra("aspectY", 4);
intent.putExtra("outputX", 480);
intent.putExtra("outputY", 640);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection",true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Gallery"),2);
a.dismiss();
}
});
//My onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if (resultCode == RESULT_CANCELED)
break;
else if (resultCode == RESULT_OK) {
try{
long imageId=ContentUris.parseId(imageUri);
myBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
isImageChanged = true;
profilePic.setScaleType(ScaleType.CENTER_CROP);
profilePic.setImageBitmap(myBitmap);
break;
}
catch(Exception e){
e.printStackTrace();
}
}
case 2:
if (resultCode == RESULT_CANCELED)
break;
try {
Uri imageUri = data.getData();
long imageId=ContentUris.parseId(imageUri);
myBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
profilePic.setScaleType(ScaleType.CENTER_CROP);
isImageChanged = true;
profilePic.setImageBitmap(myBitmap);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
答案 0 :(得分:0)
可能你可能会在
上获得例外byte[] b = baos.toByteArray();
要处理您想要考虑的recycling图片。
此外,使用Multipart被认为是更好的选择,因为您使用的是Base64,您可能也想在Jen's Post上进行思考。
还有一个建议是,如果您使用的是11级或更高级别的API,那么您可以考虑使用:
android:largeHeap="true"
这将帮助您安全地执行转换和处理(前提是您没有泄漏任何变量)。有关此问题的详细信息,请参阅Application上的文档。
如果您仍然遇到任何问题,请告诉我。