Android 图片添加水印的实现方法
作者:brycegao321 发布时间:2023-11-20 01:13:29
标签:Android,水印
Android 图片添加水印的实现方法
实现效果图:
手机端打水印(文字和图片)使用的是Bitmap、Matrix和Canvas类的一些方法, 可以实现拉伸、旋转、位移等等效果。 原理很简单, 就是在画布Canvas上绘制图形、图片、文字等等, 得到你想要的效果图片。
百度搜索图片打水印有很多结果, 没找到斜着打水印的代码,有很多公司都要求上图的效果, 所以写着玩玩。
/*
添加全屏斜着45度的文字
/
public static Bitmap drawCenterLable(Context context, Bitmap bmp, String text) {
float scale = context.getResources().getDisplayMetrics().density;
//创建一样大小的图片
Bitmap newBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.ARGB_8888);
//创建画布
Canvas canvas = new Canvas(newBmp);
canvas.drawBitmap(bmp, 0, 0, null); //绘制原始图片
canvas.save();
canvas.rotate(45); //顺时针转45度
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.argb(50, 255, 255, 255)); //白色半透明
paint.setTextSize(100 scale);
paint.setDither(true);
paint.setFilterBitmap(true);
Rect rectText = new Rect(); //得到text占用宽高, 单位:像素
paint.getTextBounds(text, 0, text.length(), rectText);
double beginX = (bmp.getHeight()/2 - rectText.width()/2) * 1.4; //45度角度值是1.414
double beginY = (bmp.getWidth()/2 - rectText.width()/2) * 1.4;
canvas.drawText(text, (int)beginX, (int)beginY, paint);
canvas.restore();
return newBmp;
}
使用44KB的png图片验证效率:
long begin = System.currentTimeMillis();
Bitmap destBmp = ImageUtil.drawCenterLable(this, sourBitmap, "某某公司专用");
long end = System.currentTimeMillis();
Log.d("brycegao", "打水印用时:" + (end-begin) + "毫秒");
mWartermarkImage.setImageBitmap(destBmp);
小米4手机输出: D/brycegao: 打水印用时:69毫秒
使用3M字节的jpg图片测试打水印,报OOM错误。
java.lang.OutOfMemoryError: Failed to allocate a 467251212 byte allocation with 16767536 free bytes and 110MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:613)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:446)
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:469)
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:501)
手机端使用Android原生方法打水印, 应该先将压缩分辨率, 避免OOM的情况, 但是影响清晰度; 大部分app都是将原图传到服务器, 在后台打水印。
因为原生方法有分辨率和内存限制, 听说七牛的图片库(支持打水印)很好用, 看看是否可以落地到各种配置的android手机中。
来源:http://blog.csdn.net/brycegao321/article/details/54312775


猜你喜欢
- 一、Netty简介Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现
- 一、静态成员1、通过static关键字修饰,是属于类,实例成员属于对象,在这个类第一次加载的时候,这个类下面的所有静态成员会被加载。2、静态
- DataGridView 列有三种排序模式。每一列的排序模式是通过该列的 SortMode 属性指定的,该属性可以设置为以下的 DataGr
- 第一步:获取存储的路径 我们用/sdcard/Android/data/包名/的路径 方便我们测试查看 String path=MyAppl
- 我就废话不多说了,大家还是直接看代码吧~/* *es配置类 * */@Configurationpublic class ElasticSe
- 本文讲述的是Android中RelativeLayout、FrameLayout的用法。具体如下:RelativeLayout是一个按照相对
- 本文介绍了java web每天定时执行任务,分享给大家,具体如下:第一步:package com.eh.util;import java.u
- 之前使用Retrofit都是将JSON串转化为POJO对象,针对不同的业务协议,定义相应的接口和参数列表。但是此种方式一般用在自己内部协议基
- 本篇内容通过操作软键盘的函数着手详细分析了隐藏或者显示软键盘的实现方法,并且对其中重要的代码做了详细分析。一、开篇如果有需要用到输入的地方,
- 一、使用PinYinConverterCore获取汉语拼音最新在做一个搜索组件,需要使用汉语拼音的首字母查询出符合条件的物品名称,由于汉字存
- Volley简单使用我这里是以依赖架包的形式 ,大家也可以以gradle的形式进行依赖。好了,接下来上代码了.....//获取volley的
-   考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决
- 1. 什么是静态内部类在Java中有静态代码块、静态变量、静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌
- 本文以实例代码实现了C#根据数字序号输出星期几,用户可通过输入数字0~6,输出星期各天的英语单词,程序中主要是演示if语句和switch语句
- 首先当我们将Dwr3配置好以后,我们可以在浏览器中测试一下,查看一下我们配置的Dwr有没有生效,方法是http://localhost:[你
- 首先说微信企业号的开发模式分为:编辑模式(普通模式)和开发模式(回调模式) ,在编辑模式下,只能做简单的自定义菜单和自动回复消息,要想实现其
- 自己写了一个Swap测试类,代码如下:swap不能交换原生数据类型以及字符串类型。public class Swap5{ public st
- android第一次新建项目是,相关依赖包需要下载很久,至少半小时,因为网速问题,还会多次下载失败。解决办法如下:1、通过镜像将gradle
- <script>//验证身份证号方法var test=function(idcard){var Errors=new Array
- 前言关于ThreadLocal (线程本地存储),从字面意思上看主要是存储一些本地变量,使它们能在一个线程内共用,与其他的线程进行数据隔离,