Android 给图片加上水印的示例代码(支持logo+文字)
发布时间 - 2026-01-11 02:35:58 点击率:次本文介绍了Android 给图片加上水印的示例代码(支持logo+文字),分享给大家,具体如下:

现在我们想要往图片上打上水印,该水印应符合这样的需求的:
- 支持logo+文字;
- 文字信息支持多行展示;
- 用户可以选择水印在图片上的生成位置(左上、右上、右下和左下)。
粗略的结构图低配版大概就长这样...
水印结构图.png
现在提供这样的一种思路去实现这一个需求,我们可以通过自定义一个view,view的布局中包含logo、公司名称和相关信息,这个view就是我们要打上图片的水印。
这样的一个view其实是一个自定义组合布局,关于如何实现组合布局的自定义view,可以参考这篇文章:Android 自定义View实践之组合控件实现布局的复用
有了水印的view之后,我们就可以利用以下这个方法,得到水印的view的Bitmap。
/**
* 将一个view转换为Bitmap
* @param view
* @return
*/
public static Bitmap convertViewToBitmap(View view){
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
得到水印的view的Bitmap之后,处理一下尺寸,保持水印的尺寸在合理范围内。
//根据原图处理要生成的水印的宽高
float width = sourBitmap.getWidth();
float height = sourBitmap.getHeight();
float be = width / height;
if ((float) 16 / 9 >= be && be >= (float) 4 / 3) {
//在图片比例区间内16;9~4:3内,将生成的水印bitmap设置为原图宽高各自的1/5
waterBitmap = WaterMaskUtil.zoomBitmap(waterBitmap, (int) width / 5, (int) height / 5);
} else if (be > (float) 16 / 9) {
//生成4:3的水印
waterBitmap = WaterMaskUtil.zoomBitmap(waterBitmap, (int) width / 5, (int) width*3 / 20);
} else if (be < (float) 4 / 3) {
//生成4:3的水印
waterBitmap = WaterMaskUtil.zoomBitmap(waterBitmap, (int) height*4 / 15, (int) height / 5);
}
然后将它按照要求绘制在原图上,提供生成左上、右上、右下和左下四个位置的水印各自的方法,关键代码如下:
/**
* 设置水印图片在左上角
* @param src
* @param watermark
* @param paddingLeft
* @param paddingTop
* @return
*/
public static Bitmap createWaterMaskLeftTop(
Context context, Bitmap src, Bitmap watermark,
int paddingLeft, int paddingTop) {
return createWaterMaskBitmap(src, watermark,
dp2px(context, paddingLeft), dp2px(context, paddingTop));
}
/**
* 设置水印图片在右下角
* @param src
* @param watermark
* @param paddingRight
* @param paddingBottom
* @return
*/
public static Bitmap createWaterMaskRightBottom(
Context context, Bitmap src, Bitmap watermark,
int paddingRight, int paddingBottom) {
return createWaterMaskBitmap(src, watermark,
src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight),
src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom));
}
/**
* 设置水印图片到右上角
* @param src
* @param watermark
* @param paddingRight
* @param paddingTop
* @return
*/
public static Bitmap createWaterMaskRightTop(
Context context, Bitmap src, Bitmap watermark,
int paddingRight, int paddingTop) {
return createWaterMaskBitmap( src, watermark,
src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight),
dp2px(context, paddingTop));
}
/**
* 设置水印图片到左下角
* @param src
* @param watermark
* @param paddingLeft
* @param paddingBottom
* @return
*/
public static Bitmap createWaterMaskLeftBottom(
Context context, Bitmap src, Bitmap watermark,
int paddingLeft, int paddingBottom) {
return createWaterMaskBitmap(src, watermark, dp2px(context, paddingLeft),
src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom));
}
/**
* 绘制水印图片
* @param src 原图
* @param watermark 水印
* @param paddingLeft
* @param paddingTop
* @return
*/
private static Bitmap createWaterMaskBitmap(Bitmap src, Bitmap watermark,
int paddingLeft, int paddingTop) {
if (src == null) {
return null;
}
int width = src.getWidth();
int height = src.getHeight();
//创建一个bitmap
Bitmap newb = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
//将该图片作为画布
Canvas canvas = new Canvas(newb);
//在画布 0,0坐标上开始绘制原始图片
canvas.drawBitmap(src, 0, 0, null);
//在画布上绘制水印图片
canvas.drawBitmap(watermark, paddingLeft, paddingTop, null);
// 保存
canvas.save(Canvas.ALL_SAVE_FLAG);
// 存储
canvas.restore();
return newb;
}
绘制后的效果应该是这样的,欢迎拍砖~
给图片加上水印.png
附上源代码:github传送门
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# 图片加水印
# 给图片加水印
# Android视频处理之动态时间水印效果
# Android添加水印的正确方法 只要三步!
# Android实现为图片添加水印
# Android给任何view添加全屏倾斜水印
# Android 图片添加水印的实现方法
# Android给图片加文字和图片水印实例代码
# android实现文字水印效果 支持多行水印
# Android图片添加水印图片并把图片保存到文件存储的实现代码
# Android实现分享长图并且添加全图水印
# Android可配置透明度的水印
# 自定义
# 结构图
# 标上
# 创建一个
# 是一个
# 这一
# 是这样
# 我们可以
# 公司名称
# 给大家
# 相关信息
# 这篇文章
# 将它
# 可以选择
# 设置为
# 转换为
# 将该
# 源代码
# 大家多多
# 如何实现
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何为不同团队 ID 动态生成多个独立按钮
详解Android图表 MPAndroidChart折线图
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何使用模型观察者?(Observer代码示例)
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
如何在云虚拟主机上快速搭建个人网站?
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel API资源类怎么用_Laravel API Resource数据转换
详解jQuery中基本的动画方法
Laravel如何实现API版本控制_Laravel版本化API设计方案
如何快速重置建站主机并恢复默认配置?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
iOS UIView常见属性方法小结
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
网易LOFTER官网链接 老福特网页版登录地址
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
JavaScript模板引擎Template.js使用详解
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
如何用好域名打造高点击率的自主建站?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
如何在阿里云通过域名搭建网站?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
详解Android中Activity的四大启动模式实验简述
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
佛山网站制作系统,佛山企业变更地址网上办理步骤?
bing浏览器学术搜索入口_bing学术文献检索地址
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何用PHP快速搭建高效网站?分步指南
详解Oracle修改字段类型方法总结
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
JavaScript数据类型有哪些_如何准确判断一个变量的类型
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
PythonWeb开发入门教程_Flask快速构建Web应用
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
如何将凡科建站内容保存为本地文件?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
中山网站推广排名,中山信息港登录入口?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
下一篇:linux怎么锁定用户
下一篇:linux怎么锁定用户

