Android 如何以Base64转换字符串将高分辨率图像上载到服务器
我正在上传服务器上的高分辨率和大图像。 我使用的API接受Base64转换字符串中的图像。 我正在将图像转换为Base64字符串并上传到服务器,但若图像很大,则会出现OutOfMemory异常。 有谁能建议我如何解决这个问题吗 这是我将Base64编码字符串中的myBitmap(位图到upoload)转换为发送到服务器的函数。 我不想压缩图像Android 如何以Base64转换字符串将高分辨率图像上载到服务器,android,Android,我正在上传服务器上的高分辨率和大图像。 我使用的API接受Base64转换字符串中的图像。 我正在将图像转换为Base64字符串并上传到服务器,但若图像很大,则会出现OutOfMemory异常。 有谁能建议我如何解决这个问题吗 这是我将Base64编码字符串中的myBitmap(位图到upoload)转换为发送到服务器的函数。 我不想压缩图像 if(myBitmap!=null){ ByteArrayOutputStream baos = new ByteArrayOutputStrea
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;
}
}
你可能会得到一个例外
byte[] b = baos.toByteArray();
处理你想考虑你的图片。
此外,使用Multipart被认为是一个更好的选择,因为您使用的是Base64,您可能也想考虑一下 另一个建议是,如果你的API水平是11或更高,那么你可以考虑使用:android:largeHeap="true"
这将帮助您安全地执行转换和处理(前提是您没有泄漏任何变量)。有关这方面的详细信息,请参阅上的文档
如果您仍然面临任何问题,请告诉我。请使用适当的代码和参考资料解释您的问题。这一定是一个代码问题,因为即使你打算上传10MB大小的图像,内存也不会用完。现在你能帮我解决这个问题吗?嗨,Abhy我使用的是android:largeHeap=true,我不能回收我的图像,因为如果我不能成功注册,我就需要使用那个位图。嗨,我没有得到“成功注册”部分。你的意思是你正在回收的位图,你以后在代码中的某个地方试图使用它吗?请通过指出问题的具体位置进行解释?是的,我正在使用该位图。意味着我无法回收该位图。