有关图片加载类的工具类

开发中的点点滴滴要懂得记录

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)
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值