我正在尝试编码/解码图像视图,我查看了50多个示例,但它仍然不起作用。
我做了一件简单的事情:
1)我正在使用http://codebeautify.org/base64-to-image-converter#
中的简单base 64数据2)我将它放入mysql数据库的blob字段(托管在远程服务器中)
3)在android中我通过Web服务正确地获取它,解码它并在图像视图中显示
public static Bitmap decodeBase64(String input)
{
byte[] decodedByte = Base64.decode(input.getBytes(), Base64.DEFAULT);
return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
}
(到目前为止一直很好)
4)我正在编码图像视图中的内容(放在步骤3中)并使用
生成base64代码 imageGrupo.buildDrawingCache();
Bitmap bitmap = imageGrupo.getDrawingCache();
ByteArrayOutputStream stream=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
byte[] image=stream.toByteArray();
finalImagemStr = Base64.encodeToString(image, 0);
5)如果我将生成的base64与我在3中收到的base64进行比较,则它们不相同。
他们应该是对的?
6)当将4)中生成的base64字符串放入远程数据库并再次读取时,它会显示
java.lang.IllegalArgumentException: bad base-64
我现在发疯了......有什么想法吗?
由于 此致
答案 0 :(得分:1)
试试我的solution,它解释了如何将位图编码为base64并将base64成功解码回位图。如果需要精确的原始图像,可以跳过代码的缩放图像部分。
答案 1 :(得分:0)
Base64是太长的文本,无法适应我的日志控制台,我花了一个小时研究为什么不工作,结果是生成的文本是相同的,但它没有输出整个文本,只有它的一部分,这可能是这里的情况
更新OP的代码请求
这就是我目前使用的方法,它非常可靠且没有任何问题。
public static String bitmapToBase64(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 30, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
return encoded;
}
为确保从imageView获取“安全”位图,getDrawableCache非常棘手。使用它。
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}
答案 2 :(得分:0)
我不明白为什么在你已经拥有位图时再次编码和解码。 顺便说一下,在PNG格式中,90会在“压缩”方法中被忽略。
答案 3 :(得分:0)
这个solution对我有用,我刚刚将Base64.DEFAULT更改为Base64.NO_WRAP 输出将与使用http://freeonlinetools24.com/base64-image
之类的在线转换器时的输出相同。private String encodeFileToBase64(String filePath)
{
InputStream inputStream = new FileInputStream(filePath);//You can get an inputStream using any IO API
byte[] bytes;
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
bytes = output.toByteArray();
return Base64.encodeToString(bytes, Base64.NO_WRAP);
}
解码:
byte[] data = Base64.decode(base64, Base64.NO_WRAP);