博客
关于我
Android - 利用扩展函数为Bitmap添加文字水印
阅读量:401 次
发布时间:2019-03-05

本文共 2339 字,大约阅读时间需要 7 分钟。

<异空间>项目技术分享系列——扩展函数为Bitmap添加文字水印

对图片Bitmap绘制文字水印还是比较常见的需求,毕竟版权意识都在增强(用户可以给自己图片加上用户名),还可以为用户提供更多的信息(例如视频缩略图)

先上效果图(比较简单的效果,可继续扩展实现),以下代码使用Kotlin语言编写

给Bitmap添加文字水印

首先注意不能对进行拉伸或缩放前的Bitmap进行绘制水印,否则水印也会一起被拉伸缩放

应该提前将Bimap拉伸,再进行绘制操作

示例代码:

//将Bitmap进行缩放,获得缩放完成后的Bitmap后,再绘制文字水印bitmap?.let {thumb ->    bitmap = Bitmap.createScaledBitmap( //缩放      thumb , ConvertUtils.dp2px(140F),      ConvertUtils.dp2px(100F),false     )    .addTextWatermark(length , ConvertUtils.dp2px(16F) , Color.WHITE ,0F,0F,false)}

addTextWatermark 方法是对Bitmap类的一个扩展方法(Kotlin)

下面示例代码目前只实现了在右下角绘制,可继续扩展:

/**     * 给一张Bitmap添加水印文字。     *     * @param content  水印文本     * @param textSize 水印字体大小 ,单位pix。     * @param color    水印字体颜色。     * @param x        起始坐标x     * @param y        起始坐标y     * @param recycle  是否回收     * @return 已经添加水印后的Bitmap     */    fun Bitmap.addTextWatermark(        content: String?,//文字内容        textSize: Int, //文字大小        color: Int, //文字颜色        x: Float, //x,y暂时比较难用,因为要指定具体位置,难以在外部直接测量文字的坐标        y: Float,        recycle: Boolean //Bitmap内存是否回收    ): Bitmap? {        if ( content == null)            return null        val ret = this.copy(this.config, true)        val paint = Paint(Paint.ANTI_ALIAS_FLAG)        val canvas = Canvas(ret)        paint.color = color        paint.textSize = textSize.toFloat()        //绘制文字        val bounds = Rect()        paint.getTextBounds(content, 0, content.length, bounds)        //默认在 Bitmap的 右下角位置开始绘制文字        canvas.drawText(content, this.width.toFloat()-bounds.width() - 20F , this.height.toFloat() - bounds.height() + 20F, paint)        if (recycle && !this.isRecycled)            this.recycle()        return ret    }

补充

Bitmap加载进ImageView,为什么会形状各异,是因为设置了不同的缩放方式

设置ImageView填充方式的前提是使用src作为设置图片的来源,否则的话,会导致图片填充方式设置无效的情况。

  • scaleType=“matrix” 是保持原图大小、从左上角的点开始,以矩阵形式绘图。
  • scaleType=“fitXY” 是将原图进行横方向(即XY方向)的拉伸后绘制的。
  • scaleType=“fitStart” 是将原图沿左上角的点(即matrix方式绘图开始的点),按比例缩放原图绘制而成的。
  • scaleType=“fitCenter” 是将原图沿上方居中的点(即matrix方式绘图第一行的居中的点),按比例缩放原图绘制而成的。
  • scaleType=“fitEnd” 是将原图沿下方居中的点(即matrix方式绘图最后一行的居中的点),按比例缩放原图绘制而成的。
  • scaleType=“Center” 是保持原图大小,以原图的几何中心点和ImagView的几何中心点为基准,只绘制ImagView大小的图像。
  • scaleType=“centerCrop” 不保持原图大小,以原图的几何中心点和ImagView的几何中心点为基准,只绘制ImagView大小的图像(以填满ImagView为目标,对原图进行裁剪)。
  • scaleType=“centerInside” 不保持原图大小,以原图的几何中心点和ImagView的几何中心点为基准,只绘制ImagView大小的图像(以显示完整图片为目标,对原图进行缩放)。

希望对有需要的人有帮助~😊

转载地址:http://uymzz.baihongyu.com/

你可能感兴趣的文章
logstash mysql 准实时同步到 elasticsearch
查看>>
Luogu2973:[USACO10HOL]赶小猪
查看>>
mabatis 中出现&lt; 以及&gt; 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>