Android Base64转图片
最近做一个项目里面有关于图片展示的需求,但是任性的后台跟我说没有图片服务器,只能给我base64让我自己转成图片,好吧,我忍,转就转吧。。
首先第一步咱还是谦虚点上百度查查别人咋转的,结果似乎各位码友关于这方面的需求还是不多啊,查来查去普遍的是这样的:
/**
* bitmap转为base64
* @param bitmap
* @return
*/
public static String bitmapToBase64(Bitmap bitmap) { String result = null;
ByteArrayOutputStream baos = null;
try {
if (bitmap != null) {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); baos.flush();
baos.close(); byte[] bitmapBytes = baos.toByteArray();
result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.flush();
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
} /**
* base64转为bitmap
* @param base64Data
* @return
*/
public static Bitmap base64ToBitmap(String base64Data) {
byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
楼主主要用到了base64转bitmap的方法,这个方法看上去没什么毛病,but。。。但是。。BitmapFactory.decodeByteArray这个方法是很邪恶的,BitmapFactory每次都会为新decode的bitmap分配内存,所以很容易造成oom,楼主为求真实性,手动刷新了几下我们的页面,然后就看着内存蹭蹭的往上涨,结果很快就oom了,所以这个所谓的往上代码并不可取,果断抛弃了,自己来改造一个,贴上自己的代码(Kotlin版本):
object ImageUtil {
private var mMemoryCache: LruCache<String, Bitmap> ?= null
private var cacheSize:Int = 0
/**
* bitmap转为base64
* @param bitmap
* @return
*/
public fun bitmapToBase64(bitmap: Bitmap): String {
var result = ""
var baos: ByteArrayOutputStream? = null
try {
if (bitmap != null) {
baos = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
baos!!.flush()
baos!!.close()
val bitmapBytes = baos!!.toByteArray()
result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT)
}
} catch (e: IOException) {
e.printStackTrace()
} finally {
try {
if (baos != null) {
baos!!.flush()
baos!!.close()
}
} catch (e: IOException) {
e.printStackTrace()
}
}
return result
}
/**
* base64转为bitmap
* @param base64Data
* @return
*/
public fun base64ToBitmap(base64Data: String): Bitmap? {
if(cacheSize == 0){
// 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。
// LruCache通过构造函数传入缓存值,以KB为单位。
val maxMemory = Runtime.getRuntime().maxMemory() / 1024
// 使用最大可用内存值的1/8作为缓存的大小。
cacheSize = (maxMemory / 8).toInt()
}
if(mMemoryCache == null){
mMemoryCache = object : LruCache<String, Bitmap>(cacheSize) {
override fun sizeOf(key: String?, bitmap: Bitmap?): Int {
// 重写此方法来衡量每张图片的大小,默认返回图片数量。
return bitmap!!.byteCount / 1024
}
}
}
var bitmap: Bitmap? = null
var imgByte: ByteArray? = null
var inputStream:InputStream ?= null
try {
mMemoryCache?.get(base64Data)?.let {
bitmap = it
}
if(bitmap == null){
imgByte = Base64.decode(base64Data, Base64.DEFAULT)
val option = BitmapFactory.Options()
option.inSampleSize = 2
option.inTempStorage = ByteArray(5*1024*1024)
inputStream = ByteArrayInputStream(imgByte)
val softReference = SoftReference(BitmapFactory.decodeStream(inputStream, null, option))
bitmap = softReference.get()
softReference.clear()
mMemoryCache?.put(base64Data, bitmap)
}
} catch (e: Exception) {
e.printStackTrace()
}finally {
imgByte = null
try {
inputStream?.close()
System.gc()
} catch (e: IOException) {
e.printStackTrace()
}
}
return bitmap
}
}
通过内存缓存机制加上软应用,保证同一张图片只decode一次,改完之后还算满意,基本上内存可以保持稳定,好了,先到这了,有啥写的不好的多多见谅,或者可以共同探讨。。
Android Base64转图片的更多相关文章
- Android Base64图片无法长按保存 问题解决
踩了一个巨坑. 目前微信ios/android 均能长按保存src=base64的图片 (微信android x5 专门解决了这个问题); 但是android其他App没有针对解决这个系统问题(姑且 ...
- Android - Base64
Android 将图片转换为Base64 public void convertToBase64(View view) throws IOException { //获取ImageView的图片 Bi ...
- laravel 存储base64格式图片
laravel 存储base64格式图片 一.总结 一句话总结: 用正则替换base64图片编码的编码头即可 存储图片的话,用laravel可以用Storage的put方法,原生php可以用file_ ...
- android获得ImageView图片的等级
android获得ImageView图片的等级问题 要实现的功能如下图,点击分享能显示选中与不选中状态,然后发送是根据状态来实现具体分享功能. 在gridview中有5个子项,每个子元素都有两张图片A ...
- 页面以base64输出图片
<% //读取文件路径,输出base64 编码 System.IO.FileStream stream = System.IO.File.OpenRead(ViewBag.FilePath); ...
- base64和图片的转换
/// <summary> /// base64转图片 /// </summary> /// <param name="strBase64">& ...
- 解决android:background背景图片被拉伸问题
ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸.src是图片内容(前 ...
- Android PNG透明图片转JPG格式背景变黑
Android PNG透明图片转JPG格式背景变黑 在上传图片是,需要把PNG格式转换成JPG格式的,但是在遇上透明背景时,转过来就变成黑色底图了! 原因是PNG支持透明图而 JPG格式不支持透明底 ...
- 通过data:image/png;base64把图片直接写在src里
从网上下了个源文件查看时候发现了引用图片的地址不是在本地上的,而是后面跟了一大串字符data:image/png;base64...查了一下资料分析如下: 关于用base64存储图片 网页上有些图片的 ...
随机推荐
- jenkins的构建项目配置
继http://www.cnblogs.com/yajing-zh/p/5109517.html搭建好jenkins系统配置之后,新建jenkins构建项目,用于自动化构建. 点击Jenkins界面左 ...
- svn 命令管理
有时候测试环境会让更新到指定版本,用以验证问题或者其他原因 具体方法有两种: 方法1: svn merge回滚 1) 先 svn up,保证更新到最新的版本,如2106: 2) 然后用 svn log ...
- django 缓存 实现
由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- JavaScript简单继承
很多C#或C++开发人员习惯使用继承来开发项目,所以当他们想学习JavaScript语言时,第一个问题一般是:“我怎么在JavaScript中使用继承?”. 实际上JavaScript使用了一种不同于 ...
- 【POJ 2585】Window Pains 拓扑排序
Description . . . and so on . . . Unfortunately, Boudreaux's computer is very unreliable and crashes ...
- sqlserver数据库的权限设置
1.先用Windows账户登陆,然后在安全性中添加用户--SQL server 身份验证,用户名,密码2.用户映射--勾选对应的数据库--数据库角色成员身份--db_owner public
- hdu6103[尺取法] 2017多校6
/*hdu6103[尺取法] 2017多校6*/ #include <bits/stdc++.h> using namespace std; int T, m; ]; void solve ...
- windows命令总结
工作中还是经常使用windows系统,将windows中常用的命令进行总结. 1. 从命令行打开资源管理器,即文件夹 start . 2. 查看端口占用情况 比如查看3000端口的占用情况 netst ...
- 网络流(自行理解的Dinic)
自行理解的Dinic 注释即讲解 #include<bits/stdc++.h> ; using namespace std; int read() { ,w=; ;ch=getchar( ...
- 解决 Springboot中Interceptor拦截器中依赖注入失败
问题: 在Springboot拦截器Interceptor中使用@Resource依赖注入时,发现运行的时候被注解的对象居然是null,没被注入进去 原配置为: @Configurationpubli ...