package cn.org.bjca.trust.push.common

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.util.Base64
import java.io.ByteArrayOutputStream
import java.io.IOException
import kotlin.math.sqrt

object GraphicHelper {


    /**
     * 缩放图片到固定文件大小
     *
     * @param bm      需要缩放的图片
     * @param maxSize 目标文件大小，单位：KB
     * @return
     */
    @JvmStatic
    fun imageZoom(bgimage: Bitmap, maxSize: Double): Bitmap {
        // 图片允许最大空间 单位：KB
        // 将bitmap放至数组中，意在bitmap的大小（与实际读取的原文件要大）
        var bm = bgimage
        val baos = ByteArrayOutputStream()
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        val b = baos.toByteArray()
        // 将字节换成KB
        val mid = (b.size / 1024).toDouble()
        // 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩
        if (mid > maxSize) {
            // 获取bitmap大小 是允许最大大小的多少倍
            val i = mid / maxSize
            // 开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍
            // 保持刻度和高度和原bitmap比率一致，压缩后也达到了最大大小占用空间的大小
            bm = zoomImage(bm, bm.width / sqrt(i), bm.height / sqrt(i))
        }
        return bm
    }

    /***
     * 图片的缩放方法
     *
     * @param bgimage   ：源图片资源
     * @param newWidth  ：缩放后宽度
     * @param newHeight ：缩放后高度
     * @return
     */
    @JvmStatic
    fun zoomImage(bgimage: Bitmap, newWidth: Double, newHeight: Double): Bitmap {
        // 获取这个图片的宽和高
        val width = bgimage.width.toFloat()
        val height = bgimage.height.toFloat()
        // 创建操作图片用的matrix对象
        val matrix = Matrix()
        // 计算宽高缩放率
        val scaleWidth = newWidth.toFloat() / width
        val scaleHeight = newHeight.toFloat() / height
        // 缩放图片动作
        matrix.postScale(scaleWidth, scaleHeight)
        return Bitmap.createBitmap(bgimage, 0, 0, width.toInt(), height.toInt(), matrix, true)
    }

    /**
     * bitmap转为base64
     *
     * @param bitmap
     * @return
     */
    @JvmStatic
    fun bitmapToBase64(bitmap: Bitmap): String? {
        var result: String? = null
        var baos: ByteArrayOutputStream? = null
        try {
            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
     */
    @JvmStatic
    fun base64ToBitmap(base64Data: String?): Bitmap? {
        val bytes = Base64.decode(base64Data, Base64.DEFAULT)
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
    }
}