现在在Android开发中很少用到Base64的BASE64Encoder及BASE64Decoder,今天在h5中需要将图片的base64数据转化为图片保存到相册,项目中居然找不到BASE64Encoder及BASE64Decoder类,一顿百度方法怎么可以引用,最后发现还是将BASE64Encoder及BASE64Decoder类源码引入最方便;

直接下载源码

补充下:Base64的加密解密BASE64Encoder及BASE64Decoder是sun公司的内部方法,并没有在java api中公开过。在Android项项目中可以引用Base64类,却不能使用加密解密方法,下载上面源码放入项目直接可以引用;

1、将图片bitmap转成base64数据

* 图片bitmap转成base64数据 * @param bitmap * @return public String convertIconToString(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream();// outputstream bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] appicon = baos.toByteArray();// 转为byte数组 String bitString = Base64.encodeToString(appicon, Base64.DEFAULT); return bitString;

2、将图片base64数据转化为bitmap

* 将图片base64数据转化为bitmap * @param imgBase64 public Bitmap base64ToPicture(String imgBase64) { byte[] decode = Base64.decode(imgBase64, Base64.DEFAULT); Bitmap bitmap = BitmapFactory.decodeByteArray(decode, 0, decode.length); return bitmap;

3、将图片保存到相册并通知刷新

* 将图片保存到相册并通知刷新 public void savePictureToAlbum(Context mContext, Bitmap bitmap) { if (bitmap == null) { return; // 把文件插入到系统图库 MediaStore.Images.Media.insertImage(mContext.getContentResolver(), bitmap, null, null); // 通知图库更新 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + "/sdcard/namecard/")));

4、对图片Base64数据解码并生成图片

* 对图片Base64解码并生成图片 * @param imgStr base64数据 * @param imgFilePath 图片存放地址 * @return public boolean generateImage(String imgStr, String imgFilePath) { if (imgStr == null) // 图像数据为空 return false; BASE64Decoder decoder = new BASE64Decoder(); try { // Base64解码 byte[] bytes = decoder.decodeBuffer(imgStr); for (int i = 0; i < bytes.length; ++i) { if (bytes[i] < 0) {// 调整异常数据 bytes[i] += 256; // 生成jpeg图片 OutputStream out = new FileOutputStream(imgFilePath); out.write(bytes); out.flush(); out.close(); return true; } catch (Exception e) { return false;

最后注意点:

含有“data:image/*;base64”的头的编码,在decode或者转化为bitmap的时候就要去掉,否则是无法还原成功的。

如我获取到的图片base64数据就是以data:image/png;base64开头的:

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABkIAAAknCAYAAADGQBGRAAAgAElEQVR4Xly9uZJtW9KltaNvT5zuNplZlQ+GWem8Ac+AglJKoaAhYIYKCgoYImYggIKAYfxd/nnvPX2c6Du+b4zpEacqbu6MOBF7r7XmnD69GT7c59b/+7/9108bvra3+9psHjebrafNDv/Y2d7ZPD4+5bW/d7A5PDzh7zubh4etzdZmd7O7s897N5v7h6vN7d3l5vzLp833b1/4/nFzef55c3d9sbm/udy8Oj7cvDo53mz53vv7zdxwZ3d3c3h8vNnbP+Syu9x5e3N9eb25ub7Z7O7ucf097v24eXx44LNbm52drc3R0QHXOsqzXl9dbm64/t39Lfe/31zdbjZXd4xjZ4f37mzevXu/+eWXX/O3i6srrrHNOPbztw0/+0DbWx3j98urzSXvub76wjW/bc5evdqcnp5uDg4ONvv7+5tbnunq4tKp4d97TNMT77vh/Veb82/n+X54eJjXE8/0dHO1OWBsBycnm92D4802Y7znXncPPB/PcMjvD3jvhtl4fHrc3N3ebG5vrzdPjw8Z7wGPeMjr6emJl+/q1xbX2N7e5d9bXOth88By7TB3W/yOR8r7vO4+z727ud/sPN1uLr5/23z79o11umNeHftWxvz0xIIw50+P25s75u3hcWfz0/tfN+95PT1tbx7uec/mhhtcZy0d/8XXc9b3G+v7ffPAh5SE16/f5PXIux8Yy8393eaa1zbru7t/kHXnht4J6eFyytcW/+a99zfXmwfGfn19ubnlZ9+/y3zvHx5s9hjDPfNxw/o9Pt3zqHxubxd5OeLvJ7xO89rl37t7h8wfcsDrjrn3tXlkULzuWI+ry+95hgOuv8f8O3Sf75g1PuG1hUxs8W9l7+bqZrPFOrnWD7f3jP2Wy/CLe2SRZ37Y4ZpPd5vv379HBk5YS18jK5GL62vWaZt77eU9vl"

处理方法:

 if (!TextUtils.isEmpty(imgUrl) && imgUrl.contains(",")) {
    //拿到真正的base64数据
     String base64Img = imgUrl.split(",")[1];

 Over,感觉有用给个赞支持下吧!

现在在Android开发中很少用到Base64的BASE64Encoder及BASE64Decoder,今天在h5中需要将图片的base64数据转化为图片保存到相册,项目中居然找不到BASE64Encoder及BASE64Decoder类,一顿百度方法怎么可以引用,最后发现还是将BASE64Encoder及BASE64Decoder类源码引入最方便;直接下载源码补充下:Base64的加密解...
在项目中需要用到文件传输入,为了传输方便最好的办法是将文件转成base64字串,再将base64字串转成字节流保存在文件了。 不过这种做法的虽然简单,但还是要根据实际需要进行选择;弊端是不能转太大的文件,文件太大会造成效率上的问题。具体多大,笔者没有做深入研究和实际测试。如有兴趣,可以自己深入研究测试。 需要导入 import android.util.Base64; {CSDN:C
最近做了一个含有二维码的海报到手机相册和分享到微信好友里面,图片是后端生成好的,传过来的格式是base64格式的,因为图片比较大,使用文档的保存和分享并没有什么用,有可能我用的不对吧,反正没有我想要的效果。 如何实现呢?我们先实现保存到手机相册在去实现分享哈。 安卓和ios都可以使用。机型我没有太多的去测试,反正我们公司的ios和安卓都可以。 一.base64图片保存到手机相册(封装) export function base64DowImg(base64){ // 创建一个Bitmap是原生图片对象 分析思路:因为这里是要获取手势轨迹并画出来,所以肯定是有个Touch事件,然后使用要回显,那肯定是要获取所画的内容,所以想到了canvas这个东西,那这样就选择了自定义控件来做了。 import android.content.Context; impo...
解决实现安卓[微信]H5长按无法保存和分享base64图片问题 问题产生原因,后台发来图片base64编码有中有空格存在,而ios的WebView可以自动做处理,android则不能。 **解决方法如下:**将返回的base64编码去空格展示。(responseText代表后端返回的base64) $("#img_a").attr(“src”,“data:image/png;base64,”+responseText.replace(/(\r\n)|(\n)|(\r)/g, ‘’)); 好了这样就解决了!
Bad notification posted from: Couldn't expand RemoteViews for: StatusBarNotification Hairll: 真的会吗 我目前使用的没有遇到 error: resource android:attr/lStar not found完美解决 shuxx0502: 非常棒的解决方案,但是我的项目需要这样解决configurations.all { resolutionStrategy { force 'androidx.core:core:1.6.0' force 'androidx.core:core-ktx:1.6.0' Android 终极推送方案(结束应用进程依然可以接收通知) LIU66_: 公司内网环境没有网络可以用这个吗