Android Bitmap最全基本操作:与Drawable 、File、btye[]互转(Kotlin 版)

原创 2018年04月17日 03:12:26
/**
 * Created by kingadmin on 2018/4/17.
 */

class BitmapUtil private constructor(private val context: Context) {

    /**
     * 文件转Bitmap
     */
    fun fileToBitmap(filePath: String): Bitmap {
        val file = File(filePath)
        val options = BitmapFactory.Options()
        /**
         * 压缩长宽各为一半避免图片过大装载不了
         */
        options.inPurgeable = true
        options.inSampleSize = 2
        return BitmapFactory.decodeFile(filePath, options)
    }

    /**
     * Bitmap转文件
     */
    fun bitmapToFile(bitmap: Bitmap, saveFilePath: String): File? {
        val file = File(saveFilePath)//将要保存图片的路径
        try {
            val bos = BufferedOutputStream(FileOutputStream(file))
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos)
            bos.flush()
            bos.close()
            return file
        } catch (e: IOException) {
            e.printStackTrace()
            return null
        }

    }

    /**
     * 数组转Bitmap
     */
    fun btyesToBtimap(bytes: ByteArray): Bitmap {
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
    }

    /**
     * Btimap转数组
     */
    fun btimapToBtyes(bitmap: Bitmap): ByteArray {
        val baos = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        return baos.toByteArray()
    }

    /**
     * Bitmap转Drawable
     */
    fun btimapToDrawable(bitmap: Bitmap): Drawable {
        return BitmapDrawable(context.resources, bitmap)
    }

    /**
     * Drawable转Bitmap
     */
    fun drawableToBitmap(drawable: Drawable): Bitmap {
        val w = drawable.intrinsicWidth
        val h = drawable.intrinsicHeight
        // 取 drawable 的颜色格式
        val config = if (drawable.opacity != PixelFormat.OPAQUE) Bitmap.Config.ARGB_8888 else Bitmap.Config.RGB_565
        val bitmap = Bitmap.createBitmap(w, h, config)
        //建立对应 bitmap 的画布
        val canvas = Canvas(bitmap)
        drawable.setBounds(0, 0, w, h)
        // 把 drawable 内容画到画布中
        drawable.draw(canvas)
        return bitmap
    }

    /**
     * 带圆角的绘制转Bitmap
     */
    fun creatRoundedBitmap(bitmap: Bitmap, roundPx: Float): Bitmap {
        val w = bitmap.width
        val h = bitmap.height
        val output = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(output)
        val color = -0xbdbdbe
        val paint = Paint()
        val rect = Rect(0, 0, w, h)
        val rectF = RectF(rect)
        paint.isAntiAlias = true
        canvas.drawARGB(0, 0, 0, 0)
        paint.color = color
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint)
        paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
        canvas.drawBitmap(bitmap, rect, rect, paint)
        return output
    }

    /**
     * 带倒影的绘制Bitmap
     */
    fun createReflectionBitmap(bitmap: Bitmap): Bitmap {
        val reflectionGap = 4
        val w = bitmap.width
        val h = bitmap.height
        /**
         * 获取矩阵变换
         */
        val matrix = Matrix()
        matrix.preScale(1f, -1f)
        val reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w, h / 2, matrix, false)
        val bitmapWithReflection = Bitmap.createBitmap(w, h + h / 2, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(bitmapWithReflection)
        canvas.drawBitmap(bitmap, 0f, 0f, null)
        val deafalutPaint = Paint()
        canvas.drawRect(0f, h.toFloat(), w.toFloat(), (h + reflectionGap).toFloat(), deafalutPaint)
        canvas.drawBitmap(reflectionImage, 0f, (h + reflectionGap).toFloat(), null)
        val paint = Paint()
        val shader = LinearGradient(0f, bitmap.height.toFloat(),
                0f, (bitmapWithReflection.height + reflectionGap).toFloat(),
                0x70ffffff, 0x00ffffff, Shader.TileMode.CLAMP)
        paint.shader = shader
        // Set the Transfer mode to be porter duff and destination in
        paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_IN)
        // Draw a rectangle using the paint with our linear gradient
        canvas.drawRect(0f, h.toFloat(), w.toFloat(), (bitmapWithReflection.height + reflectionGap).toFloat(), paint)
        return bitmapWithReflection
    }

    companion object {

        private var btimapUtil: BitmapUtil? = null

        fun getBtimapUtil(context: Context): BitmapUtil {
            if (btimapUtil == null) {
                synchronized(BitmapUtil::class.java) {
                    btimapUtil = BitmapUtil(context)
                }
            }
            return btimapUtil!!
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29856589/article/details/79969035

Android Bitmap最全基本操作:与Drawable 、File、btye[]互转

/** * Created by kingadmin on 2018/4/17. */ public class BitmapUtil { private static BitmapU...
  • qq_29856589
  • qq_29856589
  • 2018-04-17 03:01:21
  • 5772

Bitmap与byte、file、Drawable之间的相互转换

1、Bitmap转换成文件:     (1)、根据指定的文件,获取这个文件的输出流     (2)、通过使用Bitmap的compress方法,设置图片存储格式,图片的质量,并制定图片的存储的输出...
  • u011043551
  • u011043551
  • 2016-08-05 20:21:53
  • 2729

Android中 Bitmap和Drawable相互转换的方法

1.Drawable—>Bitmap Resources res=getResources(); Bitmap bmp=BitmapFactory.decodeResource(res, R....
  • hezhipin610039
  • hezhipin610039
  • 2012-08-23 11:47:06
  • 151652

Android Drawable Resource学习(二)、BitmapDrawable和Bitmap

一、如何创建一个BitmapDrawable对象 Bitmap,代表一个位图图像,Android支持三种格式的位图图像:.png (preferred),.jpg (acceptable), .gi...
  • LonelyRoamer
  • LonelyRoamer
  • 2012-11-08 11:56:08
  • 34061

资源文件转换成Drawable或Bitmap

1、 Resources resources = mContext.getResources(); Drawable drawable = resources.getDrawable(R....
  • dxj151364136
  • dxj151364136
  • 2015-01-18 10:22:50
  • 1530

android如何获取res文件夹下drawable文件夹下的图片资源文件转成一个BitMap对象

网上有很多方法: bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.img);...
  • u013337840
  • u013337840
  • 2014-08-06 19:14:29
  • 5190

Android常用的Drawable和Bitmap之间的转化方法

bitmap和Drawable间的区别: Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明...
  • zw904448290
  • zw904448290
  • 2016-11-07 18:45:02
  • 12162

android 获取资源文件 r.drawable中的图片转换为drawable、bitmap

android 获取资源文件 r.drawable中的图片转换为drawable、bitmap 转载自http://cfanz.cn/index.php?c=article&a=read&id=...
  • u013096866
  • u013096866
  • 2015-03-21 15:32:45
  • 14449

Android开发中Bitmap和Drawable的区别

- Drawable和Bitmap之间可以互相转换,Drawable占用内存远小于Bitmap。- setImageDrawable使用资源文件;setImageBitmap使用bitmap图片,该图...
  • liu537192
  • liu537192
  • 2015-08-14 17:37:46
  • 1608

Android中Drawable与Bitmap相互转换的方法

1..Bitmap转Drawable Drawable drawable =new BitmapDrawable(bmp); 2.Drawable转Bitmap ...
  • baidu_33512336
  • baidu_33512336
  • 2017-04-09 11:12:52
  • 999
收藏助手
不良信息举报
您举报文章:Android Bitmap最全基本操作:与Drawable 、File、btye[]互转(Kotlin 版)
举报原因:
原因补充:

(最多只允许输入30个字)