Android——为图片增加水印,并且保存到图库刷新

为图片增加水印我们可以通过canvas来绘制,首先我们新创建一个工具类:

object WaterMarkHelper {
    fun createWaterMaskBitmap(context: Activity?, src: Bitmap, watermark: String, paddingLeft: Int, paddingTop: Int): Bitmap {
        //底层图片宽高
        val width = src.width
        val height = src.height
        val paint = Paint()
        //初始化笔
        with(paint) {
            color = Color.parseColor("#ffe5e5e5")
            isAntiAlias = true
            textSize = 24f
        }
        //测量文字宽度
        val textWidth = paint.measureText(watermark).toInt()
        //创建一个bitmap
        val newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)// 创建一个新的和SRC长度宽度一样的位图
        val canvas = Canvas(newBitmap)
        //将该图片作为画布,绘制开始坐标根据图片宽高决定
        canvas.drawBitmap(src, (canvas.width - width) / 2f,
                (canvas.height - height) / 2f, null)
     
        //绘制水印
        for (i in paddingTop..height step 150) {
            for (j in paddingLeft..width step 150 + textWidth) {
                canvas.drawText(watermark, j.toFloat(), i.toFloat(), paint)
            }
        }
        // 保存
        canvas.save()
        // 存储
        canvas.restore()
        return newBitmap
    }

调用下载图片,添加水印,并且刷新图库:

private fun downFile(bitMap: Bitmap, saveDir: String) {
    val fileName = Date().time.toString() + ".jpg"
    val file = File(saveDir)
    if (!file.exists()) {
        file.mkdir()//如果路径不存在就先创建路径
    }
    //多重File目录下再次新建File对象,否则拿到的不是文件,而是路径
    val picFile = File(file, fileName)
    try {
            //绘制水印
          val newBitmap =    WaterMarkHelper.createWaterMaskBitmap(mActivity, bitMap, userName
                    ?: "", 10, 10)
        val fos = FileOutputStream(picFile)
        //通过io流的方式来压缩保存图片
        val isSuccess = newBitmap.compress(Bitmap.CompressFormat.JPEG, 60, fos)
        fos.flush()
        fos.close()

        //把文件插入到系统图库
        //2020/1/11 android X 弃用insertImage()方法,直接设置IS_PENDING
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            MediaStore.Images.Media.IS_PENDING
        } else {
            MediaStore.Images.Media.insertImage(context?.contentResolver, picFile.absolutePath, fileName, null)
        }
        //保存图片后发送广播通知更新数据库
        val uri = Uri.fromFile(picFile)
        context?.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri))
       
    } catch (e: IOException) {
        e.printStackTrace()
    }
  
}

你可能感兴趣的:(android深入学习)