android 普通相机拍照加自己定义的水印
业务场景描述 :特殊照片防止被别人利用,需要添加水印,最近项目中要用到这一功能,记录一下
先来一张效果图:
思路:
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(); } } }
大致就这样搞定图片水印添加。