最近项目中需要实现拍摄照片、视频添加水印的需求,在网上找了一圈都没找到特别好用的三方,于是自己借鉴其他库实现了一个拍摄照片及视频添加水印的功能,本项目中的水印均以图片的形式添加进去!!!

先看下效果图吧(GIF图片一直上传不上去,只能演示下静态图片,动态图片可以上Github查看)

实现原理也很简单,图片水印就是将拍摄的照片转成bitmap,然后将水印内容以图片或者文字的形式绘制到一起去,视频水印通过RxFFmpeg库来实现的,该库实现的方式不是拍摄实时添加水印,而是视频拍摄好后,提供水印图片合成到视频中去的方式实现。

核心代码

  /*** 绘制图片水印*/public void stampImage(Bitmap masterBitmap, Bitmap watermark, StampPadding padding, int requestId) {int width = masterBitmap.getWidth();int height = masterBitmap.getHeight();Paint paint = new Paint();paint.setFilterBitmap(true);Bitmap newBitmap = null;Canvas canvas = null;try {newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);canvas = new Canvas(newBitmap);canvas.drawBitmap(masterBitmap, 0, 0, paint);canvas.drawBitmap(watermark, padding.left, padding.top-watermark.getHeight(), paint);canvas.save();canvas.restore();if (mStampWatcher != null) {mStampWatcher.onSuccess(newBitmap,requestId);}} catch (Exception e) {if (mStampWatcher != null) {mStampWatcher.onError(e.getMessage(),requestId);}}}
 /*** 绘制文字水印*/public void stampText(Bitmap masterBitmap, String label, int labelSize, int labelColor, StampPadding padding, int requestId) {Paint paint = new Paint();paint.setFilterBitmap(true);paint.setDither(true);paint.setColor(labelColor);paint.setTextSize(labelSize);Bitmap newBitmap = null;Canvas canvas = null;try {Bitmap.Config config = masterBitmap.getConfig();if (config == null) {config = Bitmap.Config.ARGB_8888;}newBitmap = masterBitmap.copy(config, true);canvas = new Canvas(newBitmap);canvas.drawText(label, padding.left, padding.top, paint);
//            canvas.save(Canvas.ALL_SAVE_FLAG); 在androidP上会报错,修改为canvas.save()canvas.save();canvas.restore();if (mStampWatcher != null) {mStampWatcher.onSuccess(newBitmap,requestId);}} catch (Exception e) {if (mStampWatcher != null) {mStampWatcher.onError(e.getMessage(),requestId);}}}
    /*** 添加视频水印* rxjava方式调用*/private void runFFmpegRxJava() {openProgressDialog();//下面text中有三个本地地址,第一个地址为视频原文件地址,第二个地址为图片水印地址,第三个地址为添加水印后视频文件地址final String text = "ffmpeg -y -i /storage/emulated/0/221.mp4 -i /storage/emulated/0/c3.png -filter_complex [0:v]scale=iw:ih[outv0];[1:0]scale=0.0:0.0[outv1];[outv0][outv1]overlay=0:200 -preset superfast /storage/emulated/0/1/225.mp4";String[] commands = text.split(" ");myRxFFmpegSubscriber = new MyRxFFmpegSubscriber(this);//开始执行FFmpeg命令RxFFmpegInvoke.getInstance().runCommandRxJava(commands).subscribe(myRxFFmpegSubscriber);}/*** 这里设为静态内部类,防止内存泄露*/public static class MyRxFFmpegSubscriber extends RxFFmpegSubscriber {private WeakReference<HomeFragment> mWeakReference;public MyRxFFmpegSubscriber(HomeFragment homeFragment) {mWeakReference = new WeakReference<>(homeFragment);}@Overridepublic void onFinish() {final HomeFragment mHomeFragment = mWeakReference.get();if (mHomeFragment != null) {mHomeFragment.cancelProgressDialog("处理成功");}}@Overridepublic void onProgress(int progress, long progressTime) {final HomeFragment mHomeFragment = mWeakReference.get();if (mHomeFragment != null) {//progressTime 可以在结合视频总时长去计算合适的进度值mHomeFragment.setProgressDialog(progress, progressTime);}}@Overridepublic void onCancel() {final HomeFragment mHomeFragment = mWeakReference.get();if (mHomeFragment != null) {mHomeFragment.cancelProgressDialog("已取消");}}@Overridepublic void onError(String message) {final HomeFragment mHomeFragment = mWeakReference.get();if (mHomeFragment != null) {mHomeFragment.cancelProgressDialog("出错了 onError:" + message);}}}

最后贴上GitHub地址:https://github.com/Roc0323/WatermarkShoot

Android拍摄照片、视频添加水印功能相关推荐

  1. Android 微信小视频录制功能实现

    目录 开发之前 开发环境 相关知识点 开始开发 案例预览 案例分析 搭建布局 视频预览的实现 自定义双向缩减的进度条 录制事件的处理 长按录制 抬起保存 上滑取消 双击放大(变焦) 实现视频的录制 实 ...

  2. Android 拍摄照片后返回缩略图的两种方法详解

    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,

  3. 1920+1080+android三星手机,三星Galaxy Note3能拍摄1080p视频吗?支持1080p播放吗?

    三星Galaxy Note3能拍摄1080p视频吗 三星Galaxy Note3能拍摄1080p视频,支持1080p(1920×1080,30帧/秒)视频录制. 三星Galaxy Note3的机身边框 ...

  4. Android调用相机拍摄照片并显示到 ImageView控件中

    在前面的一篇文章中曾介绍过简单的开启相机照相功能,详见  Android简单调用相机Camera功能,实现打开照相功能 ,这一次就会将前面拍摄的照片显示到ImageView中,形成一个完整的效果 看实 ...

  5. Android拍摄raw照片,这20款摄影APP,让你的照片飞上天!

    原标题:这20款摄影APP,让你的照片飞上天! 在简书上有位叫作"老刘用手机拍电影"的摄影师,按他的自我介绍说:"我看过 10000 部电影.现在,我正用手机拍一部长片. ...

  6. Android - WebView接入H5客服照片/视频上传

    webView加载H5,主要是解决上传图片和视频的问题. 1)Activity定义一些常量变量 private static final int REQUEST_CODE_PERMISSION_CAM ...

  7. android 图片 生成视频,照片制作成视频的方案有吗?如何视频安卓手机视频编辑器将手机里的照片制作成视频...

    狸窝是帮助用户解决问题 提供教程解决方案 在这个过程中有使用我们自己开发的软件 也有网上找的工具 只要帮助用户解决问题就好!同意即往下继续了解下载 ... 在现在这个信息时代,几乎都是人手一部智能手机 ...

  8. android照片备份软件下载,照片视频备份软件下载-照片视频备份 安卓版v1.0.1-PC6安卓网...

    照片视频备份是一款非常好用的照片视频备份软件,软件功能强大,有充足的内存空间可以帮助用户备份照片和视频,还有多重加密保护,让你的隐私得到保护. 软件介绍 照片视频备份app下载,很明显这是一款帮助大家 ...

  9. Android仿微信小视频录制功能

    还没看完,应该还不错,先收藏,觉得可以开拓 https://blog.csdn.net/u012227600/article/details/50835633 -------------------- ...

最新文章

  1. 基于曲率的体素聚类的三维激光雷达点云实时鲁棒分割方法
  2. android8 Notification
  3. STM32 进阶教程 1 - micropython 移植
  4. CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍
  5. Eclipse 一直Building Workspace 的解决办法
  6. Tensorflow -mofan1
  7. Mac在命令行中打开Finder
  8. pe卸载win10更新补丁_新图标+新功能!win10凌晨更新补丁
  9. Java帧率,android应用性能优化之帧率 - hellominefriend的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  10. jpg、jpeg、png... 的区别
  11. 好东西再安利一遍!!
  12. Hadoop配置Yarn
  13. 易语言html代码解释器,易语言执行javascript
  14. Java数组的三种打印方式
  15. matlab 信号去直流,Speex中的近端信号去直流和预加重操作
  16. 矩阵转置matlab的函数,【ZZ】Matlab矩阵操作
  17. 电子内窥镜的研究现状及发展趋势
  18. 程序员被离职赔偿18万,房贷八千,只够还一年半,领导:回来上班
  19. 和monkey的相处日记
  20. 跨境支付行业洗牌在即:本月底必须登记 支付机构不得再“借牌照”

热门文章

  1. 【Codeforces 1083A】The Fair Nut and the Best Path
  2. BZOJ 1787 [Ahoi2008]Meet紧急集合 题解与分析
  3. 怎样把不同的文字合并成一组文字文本?
  4. Vmware WorkStation的三种联网方式
  5. d盘不见了 计算机打不开,d盘不见了怎么办 d盘不见了原因及解决方法
  6. 终端切换python环境_mac命令行切换python版本
  7. 面试过阿里的P7大佬分享:180+道Java面试题目!含答案解析!
  8. Linux操作系统的基础知识
  9. 树莓派4B入门及应用
  10. 为何安装MySQL后每天会有cmd弹窗