使用BASE64.EncodeString[Android][Java]将多媒体资料照片转换为BASE64时,获取损坏的图像字符串
当使用Base64编码器从活动转换画廊照片时,我得到一个错误的Base64字符串。当使用一个站点来测试这一点时,它是一个损坏的图像。尝试发布此字符串时,ExpressAPI也会在字符串上显示验证错误 我已经尝试过使用不同的位图变体,如工厂等使用BASE64.EncodeString[Android][Java]将多媒体资料照片转换为BASE64时,获取损坏的图像字符串,java,android,image,bitmap,base64,Java,Android,Image,Bitmap,Base64,当使用Base64编码器从活动转换画廊照片时,我得到一个错误的Base64字符串。当使用一个站点来测试这一点时,它是一个损坏的图像。尝试发布此字符串时,ExpressAPI也会在字符串上显示验证错误 我已经尝试过使用不同的位图变体,如工厂等 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //call super super.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//call super
super.onActivityResult(requestCode, resultCode, data);
Uri imageUri = data.getData();
InputStream imageStream = null;
try {
imageStream = getContentResolver().openInputStream(imageUri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
encodedString = encodeImage(selectedImage);
}
我显然希望使用Base64字符串,但我得到的是:
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB: AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAONA1wDASIA
AhEBAxEB/8QAHwAAAQQDAQEBAQAAAAAAAAAAAAQFBgcICQoBAgML/8QAhRAAAAEHBwgGBQYHBg4M
CQEZAQACAwQFESEGBzFBUWHwCBRxgZGhscEJEhMk0eEKFSM08Ro5UpKXuBYiM0RXctgXMkNUgtIY
GSU4OkJid3iIorK3wjZWWFlkaHOVlrTU4iY1dHV2ttXW1ygqN1VmlJintbPyJ0VGR0hTZXmFhoeo
xMbH/8QAGwEBAAMBAQEBAAAAAAAAAAAAAAQFBgEDAgf/xABIEQACAAIGBwYEBQMDAgUEAwEAAQQR
ITFBUWGRAhRxgaHB8BKCorHR4QWS0vEiMkJSYgMGchWywhY1JDRUVfIjJUXiE0NTc//aAAwDAQAC EQMRAD8A7+CCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCAC
CCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACC
CCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCC
CACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCC
ACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCA
CCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCAC
CCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACC
CCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCC
CACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCC
ACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCA
CCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCAC
CCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACC
CCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCC
CACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCC
ACCCCACCCCACCCCACCCCACCCCACCCCACCCCAqOdOdGSEzM2s4M7U4zTMk3Iia6R0opwpYtmHVZcn
pKMMZSyjSC+IgahRif1QcCURE3rGiACGlHoTZZZSuVlJmfPpD8oSXcvEEm8qCcBuIMnDJ7aEo22M
30zUykm0hyJSFEr9QxFnDTWgWRzgQRowSIEyI0wEicEiDHz0oGe2VTIyUZl8jWbYw0ZysuOe+T82
Cv1DRHsVcTkYpTzjniBpqZOcgRR6oPQInCInR6JJiZoJJ5PczE1cyUi1XM5KTTyDk3N2wDRF4gxp
MsBCqoBChxoig6wgLxA4BiQHOj0C2XjlZ5YWUt0l0jcoidhBOJJqYecWT7CmpVEUjGBJ05kKq1Ku
e9CsmmirAaIiKJnqRhoHQAxUQIjjzEBhxpdS5cWvotP9eB0yf99aQ/8ApGyhC7SiAC5aMrPLpytZ
ufSDsjrIrkVO0mY+TlOvNoxGrLiboJHyCaqVrJUqCfQ1IBq4kNFeQGH+r1E0T3GpgBUVjzkfaoEf
V6ly4tMuv+ywOj5/vUTV/wCZlAkBsU6WCfmfHo7cqzI9y91acacJfyJW3KX+h3yxJqPwpTNGbSSC
vLDtBkhPOdJo/roxW1cOuiSnIj+1NAxEkSI0Ip3H9CrOaTMbCgptJlrKqvMpdUQaCivKR5nqpfMP
e494dYBNeBpwPOH8V4iLzRNDC/pKsl9Wyx8hDKbycczNWmvOBNa3fwOMMcIfh3JnqSum0OeIxdLS
TcmxOvoB7gHXF6OJlVpcqPo0ZtFOVp+dS5ye262snyVCQAA0T0jOSKQIDj4PPOSIkqM0DxERFCgM
AIOcAwqOUBl2ndPm1cnJInnBN6PtTmbMauaDNmxDZuQlMM0Zq8agCWZsmgWOp60A1yoC/wBicc5V
ihEDCXdOBlF9IBk/SkyHgyGEsv8ANJwp4mux58jZBzQMOdA46TJgSW7I9YRJzAEw8Tki2jEwOuJ5
vUE9Mf1RRGZYq3SnyDX+lJafRbmzXy0Nl+oTchLgJ1gW2F6j7D8Gvwq7EFYRBKBwIPZmmAaaIJfx
83f7EvnpKulNkF0bDVyamPLebCWU5I5S84zWm0YAyTaLBZQyaTGIUKXrnnphEUgOOR9UTRE4BMER
S9oImogNuBBBBAc2XpI2WplP5CeSXMnONkpzkmTZy1lTPwxpFNNtpZIsCUINNhpJv5VrAmmmLIJD
EZoJkSFIaBhgGGnIzAMNNNRI39EEllpYWpNMBbWwAF1ZYLEXVwa/x0BiU5wWu6z6AgNYw5R/TB/6
wrJu/wALtif6E51yzJylemwZU0k4yvklZGOS1O3l75UMgWUxwl1JCZVE2zpEzagKMDHSrlQlQpgO
ADDRNABDqj1gNSCKM3qkB0OEFyTt70ifKQyYpQsJB0ivRWT6ZMk3zfXhZRk6DHlYjlArI0gB+IlS
IwRIUqU0DnHHIwXTX0B2cBDptmYnfmyygZq5FTxzOyqY0uZsZwZOMeUUjJWM4esx2qwzhDqHmHC4
TRAOsHVE1xpwuDrGmgJwGj/JOyg8viW3TZ5b8xs8J8uEORhNpNk2GnMMot2ac1gyMTyjOlBMWEng
k9OUZJZDnwGKq61FjsEyZYNMPPTrZpiVOYBw7z5050ZITMzazgztTjNMyTciJrpHSinCli2YdVly
ekowxlLKNIL4iBqFGJ/VBwJRETesaIAIa6Jg+lJkDP30juUv0dLEmvllJyW+TFJFpS1lDLporrBP
YMpDQSSKR9mrI0QikRGifOQiSGgcckRo0gddJ+J1zg1y+lAz2yqZGSjMvkazbGGjOVlxz3yfmwV+
oaI9iricjFKecc8QNNTJzkCKPVB6BE4RE6IGQfQmyyylcrKTM+fSH5Qku5eIJN5UE4DcQZOGT20J
RtsZvpmplJNpDkSkKJX6hiLOGmtAsjnAgjRgkQJkRpgJE4JEGkSZvKk6ejLmy8MvTJ0yQcuaambi
TuTNPHOgpMlTnvm+mjX1BTkQrTwJJLyUBhrkmcmpZXFtMCsqpTj1leTpU6c80e0TJFhKHX7XJiZo
JJ5PczE1cyUi1XM5KTTyDk3N2wDRF4gxpMsBCqoBChxoig6wgLxA4BiXJD6PN88R01n99WdP7yEr
SAvn+g49LH/30DIv/wChknP2BSP6Dj0sf/fQMi//AKGSc/YFLrOIIDmZnHyaemeU+jIyh0c8uWcr
tvLfmtnCXJ9pkZwsmJbPYzOb0gZNybV0v7jEoZOhIubZBmqyKNsJkyM9VTpE5ydTAxcSChTJFzal
0ZGW/JnpBsjCafKVZmYqUoJTM31XOfJ9nOdJedCTIIglXJw4x7xORHmgcAg4wE
看看这个请求:
请求如下:
private void uploadMeme() {
RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
String url = "Hiding this for personal reasons";
final MemeCreateActivity activity = (MemeCreateActivity) getActivity();
assert activity != null;
try {
JSONObject jsonBody = new JSONObject();
jsonBody.put("Title", title);
jsonBody.put("Longtitude", activity.getLon());
jsonBody.put("Lattitude", activity.getLat());
jsonBody.put("Picture", activity.getEncodedString());
final String mRequestBody = jsonBody.toString();
Log.d(mRequestBody, "Request:");
JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
activity.nextView();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
parseVolleyError(error);
}
}) {
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
//Sets Request headers
Map<String, String> headers = new HashMap<>();
headers.put("Accept", "application/json");
headers.put("Content-Type", "application/json");
headers.put("Authorization", "Bearer " + activity.getUser().getJwt());
return headers;
}
@Override
public byte[] getBody() {
try {
return mRequestBody == null ? null : mRequestBody.getBytes("utf-8");
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mRequestBody, "utf-8");
return null;
}
}
};
requestQueue.add(stringRequest);
} catch (JSONException e) {
e.printStackTrace();
}
}
private void uploadMeme(){
RequestQueue RequestQueue=Volley.newRequestQueue(getActivity().getApplicationContext());
String url=“出于个人原因隐藏此信息”;
final MemeCreateActivity=(MemeCreateActivity)getActivity();
断言活动!=null;
试一试{
JSONObject jsonBody=新的JSONObject();
jsonBody.put(“Title”,Title);
jsonBody.put(“Longtitude”,activity.getLon());
jsonBody.put(“latitude”,activity.getLat());
jsonBody.put(“Picture”,activity.getEncodedString());
最后一个字符串mRequestBody=jsonBody.toString();
Log.d(请求主体,“请求:”);
JsonObjectRequest stringRequest=新的JsonObjectRequest(Request.Method.POST,url,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
activity.nextView();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
截击错误;
}
}) {
@凌驾
公共字符串getBodyContentType(){
返回“application/json;charset=utf-8”;
}
@凌驾
公共映射getHeaders()引发AuthFailureError{
//设置请求头
Map headers=newhashmap();
headers.put(“接受”、“应用程序/json”);
headers.put(“内容类型”、“应用程序/json”);
headers.put(“授权”、“承载者”+activity.getUser().getJwt());
返回标题;
}
@凌驾
公共字节[]getBody(){
试一试{
返回mRequestBody==null?null:mRequestBody.getBytes(“utf-8”);
}捕获(不支持的编码异常uee){
wtf(“尝试使用%s获取%s的字节时不支持编码”,mRequestBody,“utf-8”);
返回null;
}
}
};
添加(stringRequest);
}捕获(JSONException e){
e、 printStackTrace();
}
}
试试这个:
public String encodeTobase64(Bitmap image) {
Bitmap immagex=image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);
Log.e("EncodedImage: ", imageEncoded);
return imageEncoded;
}
在onActivityResult()中使用以下代码
您可以尝试通过拾取的文件路径获取位图: 在你的onActivityResult中
InputStream imageStream = null;
try {
imageStream = this.getContentResolver().openInputStream(selectedImage);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
encodeTobase64(yourSelectedImage);
对。。我找到了答案。基本上,Android认为在我的字符串中插入多个空格很有趣 通过执行此操作,您可以将其全部删除:
activity.getEncodedString().replaceAll("\s+","")
Java用base64字符串中的空格解码位图,请尝试以下操作:
encodedString.replaceAll(“\\s+”,”)代码>可能无法在日志中显示整个字符串!或者可能是你的图像已损坏。我尝试了不同的图像。但这里是字符串:是的,日志有一个限制,您应该尝试将数据直接保存在txt文件中,以尝试将其转换回原始帖子中我也将函数写入api这给了我一个权限错误:E/BitmapFactory:无法解码流:java.io.FileNotFoundException:/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20190404-WA0009.jpg(权限被拒绝)我修复了权限,但仍然得到一个错误的base64字符串。每当我尝试解码它时,我只会得到一个损坏的图像。我使用的代码与您在encodeImage()
中使用的代码完全相同,它对我有效,也许您的解码器有故障?或者你有错误的文件格式?(即,尝试转换PNG文件,但您使用bm.compress(Bitmap.CompressFormat.JPEG,100,baos)
我只使用已压缩的WhatsApp图像我相信,它们是JPG检查原始帖子中我的请求图像
Uri targetUri = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(targetUri,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
//getting the actual path of the file
String path = cursor.getString(columnIndex);
cursor.close();
Bitmap bm = BitmapFactory.decodeFile(path);
//your encoding function is ok
encodedString = encodeImage(selectedImage);
activity.getEncodedString().replaceAll("\s+","")