开发中的点点滴滴要懂得记录
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.drawable.Drawable
import android.util.Base64
import android.widget.ImageView
import android.text.TextUtils
import android.widget.TextView
import com.ph.lib.base.utils.logger.Logger
import java.lang.Exception
import java.io.ByteArrayOutputStream
class ImgUtil {
companion object{
/**加载base64图片流*/
@JvmStatic fun setBase64ImgUrlToIv(base64ImgUrlStr: String?, imageView: ImageView){
if (TextUtils.isEmpty(base64ImgUrlStr)){
Logger.e("error: ", "base64 img url is null")
return
}
val decodeStr: ByteArray = Base64.decode(base64ImgUrlStr, Base64.DEFAULT)
val decodeByteBp: Bitmap = BitmapFactory.decodeByteArray(decodeStr, 0, decodeStr.size)
imageView.setImageBitmap(decodeByteBp)
}
/**获取Res下的drawable文件夹下图片资源*/
@JvmStatic fun getRes(mContext: Context, imageName: String): Bitmap? {
return try {
val appInfo = mContext.applicationInfo
val resID = mContext.resources.getIdentifier(imageName, "drawable", appInfo.packageName)
BitmapFactory.decodeResource(mContext.resources, resID)
}catch (e: Exception){
null
}
}
/**
* 给textView设置四周图片
*/
@JvmStatic fun setImageToTextView(textView: TextView, drawable: Drawable?, setLocation: String = "left"){
drawable?.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
when(setLocation){
"left" -> textView.setCompoundDrawables(drawable,null,null,null)
"top" -> textView.setCompoundDrawables(null,drawable,null,null)
"right" -> textView.setCompoundDrawables(null,null,drawable,null)
"bottom" -> textView.setCompoundDrawables(null,null,null,drawable)
}
}
/**
* 传入url 先压缩 后转为base64
* @param srcPath
* @return
*/
@JvmStatic fun getBase64StringFromFile(srcPath: String): String? {
val newOpts = BitmapFactory.Options()
//开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true
var bitmap = BitmapFactory.decodeFile(srcPath, newOpts)//此时返回bm为空
newOpts.inJustDecodeBounds = false
val w = newOpts.outWidth
val h = newOpts.outHeight
//现在主流手机比较多是1080*1920分辨率,所以高和宽我们设置为
val hh = 1920f //这里设置高度为1920f
val ww = 1080f //这里设置宽度为1080f
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
var be = 1 //be=1表示不缩放
if (w > h && w > ww) { //如果宽度大的话根据宽度固定大小缩放
be = (newOpts.outWidth / ww).toInt()
} else if (w < h && h > hh) { //如果高度高的话根据宽度固定大小缩放
be = (newOpts.outHeight / hh).toInt()
}
if (be <= 0)
be = 1
newOpts.inSampleSize = be //设置缩放比例
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
bitmap = BitmapFactory.decodeFile(srcPath, newOpts)
return compressImageToBase64(bitmap) //压缩好比例大小后再进行质量压缩
}
private fun compressImageToBase64(image: Bitmap): String? {
val baos = ByteArrayOutputStream()
image.compress(Bitmap.CompressFormat.JPEG, 100, baos) //质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
var options = 100
while (baos.toByteArray().size / 1024 > 8*1024) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset() //重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, options, baos) //这里压缩options%,把压缩后的数据存放到baos中
options -= 10 //每次都减少10
}
val bytes = baos.toByteArray()
return Base64.encodeToString(bytes, Base64.NO_WRAP)
}
}
}