业务场景描述 :特殊照片防止被别人利用,需要添加水印,最近项目中要用到这一功能,记录一下
先来一张效果图:
思路:
1.拍照功能就不用多说,用android 系统自带的相机拍照得到Bitmap
2.自定义要添加水印的文本内容
3.再把文本内容绘制到Bitmap上就可以
4.下面是我自己封装的一个添加水印的工具类:
public class CommonUtil {
/**
*
*把自定义的文本内容生成一张Bitmapt图片
*
*/
public static Bitmap CreateWatermark(String mark)
{
int w = 2000, h = 150;
Bitmap waterMark = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444);
Canvas canvasTemp = new Canvas(waterMark);
Paint p = new Paint(); //画笔
String familyName = "宋体";
Typeface font = Typeface.create(familyName, Typeface.BOLD);
p.setColor(Color.YELLOW);
p.setTypeface(font);
p.setTextSize(50);
canvasTemp.drawText(mark, 0, 100, p);
return waterMark;
}
/**
*
*把2张图片合并成一张图片
*
*/
public static Bitmap CreateBitmapWithWatermark(Bitmap src, Bitmap watermark)
{
if (src == null)
{
return null;
}
int w = src.getWidth();
int h = src.getHeight();
int ww = watermark.getWidth();
int wh = watermark.getHeight();
Bitmap destMap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
Canvas cv = new Canvas(destMap);
cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src
cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角画入水印
cv.save(Canvas.ALL_SAVE_FLAG);// 保存
cv.restore();// 存储
return destMap;
}
// 位图存为图片 bitmap 合成水印的图片,path 保存图片的路径
public static Boolean saveImage(Bitmap bitmap, String path)
{
boolean success = false;
try
{
File file = new File(path);
File folder = new File(file.getParent());
if (!folder.exists())
{
folder.mkdirs();
}
BufferedOutputStream bos;
bos = new BufferedOutputStream(new FileOutputStream(file));
success = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
}
catch (Exception e)
{
e.printStackTrace();
success = false;
}
return success;
}
}
5.接下来就是调用:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
//得到图片的路径
if (requestCode==VISIT_DETAIL_CAMERA){
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
// 获取水印文本 -- 日期
String date = CommonUtil.getCurrentDateTimeString();
// 创建水印位图
String account = SharedUtils.getString("account");
Bitmap waterMap = CommonUtil.CreateWatermark(date+"拍摄账号:"+account);
// 合并水印
Bitmap destMap = CommonUtil.CreateBitmapWithWatermark(bitmap, waterMap);
iv_photos.setImageBitmap(destMap);//显示到ImageView上
//保存到数据路
if ( CommonUtil.saveImage(destMap, fullPath)){
String visitGuid = SharedUtils.getString("visitGuid");
fileInfo info=new fileInfo(null,fullPath,"0",System.currentTimeMillis(),visitGuid ); //0为拍照
dao.insert(info);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
大致就这样搞定图片水印添加。