Android 将 PNG 编码为 base64 字符串产生无效结果
Android encoding PNG to base64 string producing invalid results
该应用程序将 base64 解码为 PNG,但是当我将文件编码回 base64 以便发送到服务器时,生成的 base64 不同并且不会生成图像。
这是原始 base64 字符串的开头:
/9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAYAAIdp
这里是 base64 从 PNG 文件编码后的开始:
iVBORw0KGgoAAAANSUhEUgAAD8AAAAvQCAIAAABPl1n3AAAAA3NCSVQICAjb4U/gAAAgAElEQVR4nO
这是我用来将文件编码为 base64 的代码:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = true;
options.inScaled = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDither = false;
File file = new File(root +"/saved_images/"+note.imageLocation );
if(file.exists()){
// TODO perform some logging or show user feedback
try {
Bitmap myBitmap = BitmapFactory.decodeFile(root +"/saved_images/"+note.imageLocation, options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
JSONObject object =new JSONObject();
object.put("image_type", "image/png");
object.put("image_data", Base64.encodeToString(byteArray, Base64.DEFAULT));
if (note.serverID == -1) {
toReturn.put(String.valueOf(i), object);
}else{
toReturn.put(String.valueOf(note.serverID), object);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i--;
}else{
Log.i("File Not Found", "NoteModel - "+file);
}
请试试这个代码,
public String encodeToBase64(Bitmap image) {
Bitmap immagex = Bitmap.createScaledBitmap(image, 350, 350, true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
Log.e("LOOK", imageEncoded);
return "data:image/png;base64," + imageEncoded.replace(" ", "").replace("\n", "");
}
public Bitmap encodeToBitmap(String encodedImage) {
encodedImage = encodedImage.substring(encodedImage.indexOf(",") + 1);
byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
return bitmap;
}
如果您确实收到了一个 base64 字符串并将其解码为 png 字节,您在不使用中间位图的情况下将其保存到文件中,那么您应该将该 png 文件加载到一个字节缓冲区中并将该字节缓冲区编码为一个 base64 字符串,这样你会上传。
如果您确实使用位图来保存图像,那是个坏主意。
不要使用 类 Bitmap
和 BitmapFactory
上传和下载文件。你最终会得到不同的图像。
试试我的 solution,它解释了如何将位图编码为 base64 并成功将 base64 解码回位图。
该应用程序将 base64 解码为 PNG,但是当我将文件编码回 base64 以便发送到服务器时,生成的 base64 不同并且不会生成图像。
这是原始 base64 字符串的开头:
/9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAYAAIdp
这里是 base64 从 PNG 文件编码后的开始:
iVBORw0KGgoAAAANSUhEUgAAD8AAAAvQCAIAAABPl1n3AAAAA3NCSVQICAjb4U/gAAAgAElEQVR4nO
这是我用来将文件编码为 base64 的代码:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = true;
options.inScaled = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDither = false;
File file = new File(root +"/saved_images/"+note.imageLocation );
if(file.exists()){
// TODO perform some logging or show user feedback
try {
Bitmap myBitmap = BitmapFactory.decodeFile(root +"/saved_images/"+note.imageLocation, options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
JSONObject object =new JSONObject();
object.put("image_type", "image/png");
object.put("image_data", Base64.encodeToString(byteArray, Base64.DEFAULT));
if (note.serverID == -1) {
toReturn.put(String.valueOf(i), object);
}else{
toReturn.put(String.valueOf(note.serverID), object);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i--;
}else{
Log.i("File Not Found", "NoteModel - "+file);
}
请试试这个代码,
public String encodeToBase64(Bitmap image) {
Bitmap immagex = Bitmap.createScaledBitmap(image, 350, 350, true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
Log.e("LOOK", imageEncoded);
return "data:image/png;base64," + imageEncoded.replace(" ", "").replace("\n", "");
}
public Bitmap encodeToBitmap(String encodedImage) {
encodedImage = encodedImage.substring(encodedImage.indexOf(",") + 1);
byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
return bitmap;
}
如果您确实收到了一个 base64 字符串并将其解码为 png 字节,您在不使用中间位图的情况下将其保存到文件中,那么您应该将该 png 文件加载到一个字节缓冲区中并将该字节缓冲区编码为一个 base64 字符串,这样你会上传。
如果您确实使用位图来保存图像,那是个坏主意。
不要使用 类 Bitmap
和 BitmapFactory
上传和下载文件。你最终会得到不同的图像。
试试我的 solution,它解释了如何将位图编码为 base64 并成功将 base64 解码回位图。