Android实现拍照添加时间水印
作者:阳光灿烂的夜 发布时间:2023-10-02 14:23:51
标签:Android,拍照,水印
本文实例为大家分享了Android实现拍照添加时间水印的具体代码,供大家参考,具体内容如下
效果如下图 :
1、拍照
// 非空判断 拍照
?if (mCamera0 != null){
? ? ? ? ? ? ? ? mCamera0.takePicture(null, null, jpeg0); // 1 front
? ? ? ? ? ? }
2、创建JPEG数据回调
// 创建JPEG图片回调数据对象
public static PictureCallback jpeg0 = new PictureCallback() {
? ? ? ? @Override
? ? ? ? public void onPictureTaken(byte[] data, Camera camera) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? // 获得图片
? ? ? ? ? ? ? ? Bitmap mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
? ? ? ? ? ? ? ? //添加时间水印
? ? ? ? ? ? ? ? Bitmap mTimeWatermark = AddTimeWatermark(mBitmap);
? ? ? ? ? ? ? ? // 判断文件夹是否存在,传入图片存储路径
? ? ? ? ? ? ? ? CreateFile(StaticVariables.mPicPath);
?
? ? ? ? ? ? ? ? String mPath = StaticVariables.mPicPath + System.currentTimeMillis()+".jpeg"; ? ? ? //临时测试命名
?
? ? ? ? ? ? ? ? File mFile = new File(mPath);
?
? ? ? ? ? ? ? ? BufferedOutputStream mOutputStream = new BufferedOutputStream(new FileOutputStream(mFile));
? ? ? ? ? ? ? ? // 将图片压缩到流中
? ? ? ? ? ? ? ? mTimeWatermark.compress(Bitmap.CompressFormat.JPEG,100,mOutputStream); ? ? ?//时间水印
?
? ? ? ? ? ? ? ? mOutputStream.flush();
? ? ? ? ? ? ? ? mOutputStream.close();
?
? ? ? ? ? ? ? ? // 停止预览
? ? ? ? ? ? ? ? mCamera0.stopPreview();
? ? ? ? ? ? ? ? mCamera0.release();
? ? ? ? ? ? ? ? mCamera0 = Camera.open(4);
? ? ? ? ? ? ? ? Parameters parameters = mCamera0.getParameters();
? ? ? ? ? ? ? ? // parameters.setPreviewSize(width, height);
? ? ? ? ? ? ? ? mCamera0.setParameters(parameters);
? ? ? ? ? ? ? ? mCamera0.setDisplayOrientation(0);
?
? ? ? ? ? ? ? ? mCamera0.setPreviewTexture(mTextureView0.getSurfaceTexture());
?
? ? ? ? ? ? ? ? // 处理完数据之后预览
? ? ? ? ? ? ? ? mCamera0.startPreview();
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
?
};
3、添加时间水印:AddTimeWatermark(mBitmap);
/**
? ? ?* 添加时间水印
? ? ?* @param mBitmap
? ? ?* @return mNewBitmap
*/
? ? private ?Bitmap AddTimeWatermark(Bitmap mBitmap) {
? ? ? ? //获取原始图片与水印图片的宽与高
? ? ? ? int mBitmapWidth = mBitmap.getWidth();
? ? ? ? int mBitmapHeight = mBitmap.getHeight();
? ? ? //定义底片 大小 将mBitmap填充 ?
? ? ? ? Bitmap mNewBitmap = Bitmap.createBitmap(mBitmapWidth, mBitmapHeight, Bitmap.Config.ARGB_8888);
? ? ? ? Canvas mCanvas = new Canvas(mNewBitmap);
? ? ? ? //向位图中开始画入MBitmap原始图片
? ? ? ? mCanvas.drawBitmap(mBitmap,0,0,null);
? ? ? ? //添加文字
? ? ? ? Paint mPaint = new Paint();
? ? ? ? String mFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEE").format(new Date());
? ? ? ? //String mFormat = TingUtils.getTime()+"\n"+" 纬度:"+GpsService.latitude+" ?经度:"+GpsService.longitude;
? ? ? ? mPaint.setColor(Color.RED);
? ? ? ? mPaint.setTextSize(20);
? ? ? ? //水印的位置坐标
? ? ? ? mCanvas.drawText(mFormat, (mBitmapWidth * 1) / 10,(mBitmapHeight*14)/15,mPaint);
// ? ? ? ?mCanvas.save(Canvas.ALL_SAVE_FLAG);
? ? ? ? mCanvas.save();
? ? ? ? mCanvas.restore();
?
? ? ? ? return mNewBitmap;
}
4、创建文件夹
// 创建 文件夹
public static void CreateFile(String path) {
? ? ? ? File destDir = new File(path);
? ? ? ? if (!destDir.exists()) {
? ? ? ? ? ? Log.i(TAG,"文件夹创建成功");
? ? ? ? ? ? destDir.mkdirs();
? ? ? ? } else {
? ? ? ? ? ? Log.i(TAG,"文件夹已存在");
? ? ? ? }
? ? }
5、Java 实现添加水印
/**
?? ? * 设置文字水印
?? ? *?
?? ? * @param sourceImg
?? ? * ? ? ? ? ? ?源图片路径
?? ? * @param targetImg
?? ? * ? ? ? ? ? ?保存的图片路径
?? ? * @param content
?? ? * ? ? ? ? ? ?内容
?? ? * @param font
?? ? * ? ? ? ? ? ?水印字体大小
? ? ? ? ?* Font font = new Font("微软雅黑", Font.BOLD, 16);
?? ? * @throws IOException
*/
public void addWatermark(String sourceImg, String targetImg,String content, Font font) throws IOException {
?? ??? ?
?? ??? ?File srcImgFile = new File(sourceImg);
?? ??? ?Image srcImg = ImageIO.read(srcImgFile);
?
?? ??? ?int srcImgWidth = srcImg.getWidth(null);
?? ??? ?int srcImgHeight = srcImg.getHeight(null);
?
?? ??? ?BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight,BufferedImage.TYPE_INT_RGB);
?? ??? ?Graphics2D g = bufImg.createGraphics();
?? ??? ?g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
?
?? ??? ?g.setColor(Color.BLACK);
?? ??? ?g.setFont(font);
?
?? ??? ?if (content.equals("model")) {
?? ??? ??? ?// 添加 设备名、MADE IN
?? ??? ??? ?g.drawString(content, 350, 110);
?? ??? ??? ?g.drawString(mMade, 50, 340);
?? ??? ?} else {
?? ??? ??? ?// 设置水印的坐标 标题
?? ??? ??? ?g.drawString(content, 50, 115);
?? ??? ?}
?? ??? ?g.dispose();
?
?? ??? ?// 输出图片
?? ??? ?FileOutputStream outImgStream = new FileOutputStream(targetImg);
?? ??? ?ImageIO.write(bufImg, "jpg", outImgStream);
?? ??? ?System.out.println("文字水印添加完成");
?? ??? ?outImgStream.flush();
?? ??? ?outImgStream.close();
?? ?}
来源:https://blog.csdn.net/qq_38629981/article/details/82910762


猜你喜欢
- 0 问题描述一个应用在运行一段时间后,随着访问量不断增加,突然处理能力下降。但是从流量,jstack,gc上看基本正常。感觉好像突然从 “健
- Lombok简介和其他语言相比,Java经常因为不必要的冗长被批评。Lombok提供了一系列注解用以在后台生成模板代码,将其从你的类中删除,
- 前言Go 语言比 Java 语言性能优越的一个原因,就是轻量级线程Goroutines(协程Coroutine)。本篇文章深入分析下 Jav
- 验证码功能在各大网站都能用到,下面小编通过实例代码给大家分享Android 获取随机验证码功能,具体代码如下所示: package cn.h
- future机制是在通过线程去执行某个任务的时候,如果比较耗时,我们可以通过futureTask机制,异步返回,继续去执行其他的任务,在需要
- java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用
- 在日常开发过程中,偶尔会出现一些极端问题。比如 网络重复请求,很难过滤 请求的问题。下面一段代码,可以解决这个重复请求的问题。下面上一段代码
- 感想:第一次写博客,感觉编辑器挺复杂厉害的,感觉自己的内容挺简单的。有什么问题请多多指教!思路:1、创建一个扑克牌的实体类Poker,设置了
- 一、添加联系人Intent addIntent = new Intent(Intent.ACTION_INSERT,Uri.withAppe
- 三目条件运算公式为 x?y:z 其中x的运算结果为boolean类型,先计算x的值,若为true,则整个三目运算的结果为表达式y
- 最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下欢迎交流和加入新的内容用到了JSwing,下面是一些具体的思路实现&
- AppWidgetProvider 用来在HOME页面显示插件实现步骤:1、为AppWidget提供一个元布局文件AppWigdetProv
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.算法的衡量标准当我们需要衡量一个算法的的优越性, 通常会
- 1 分布式1.1 什么是分布式分布式系统一定是由多个节点组成的系统。其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。这
- 简介官方API文档Scaffold的of方法说明有说明调用Scaffold.of方法是在Scallfold的子组件的Build方法中,也就是
- 一、单文件压缩 场景,文件可能比较大,需要压缩传输,比如上传和下载/// <summary&g
- 目前Android平台提供了两类动画一类是Tween动画,第二类就是 Frame动画,具体内容介绍请看下文:一类是Tween动画,就是对场景
- 本文实例讲述了Java实现多个wav文件合成一个的方法。分享给大家供大家参考,具体如下:前面一篇介绍了java切割wav音频文件的方法,这里
- 导航和路由Flutter提供了一个完整的用于在屏幕之间导航和处理深层链接的系统。没有复杂深度链接的小型应用程序可以使用Navigator,而
- 对于简单的场景来讲,在MEF中导入依赖模块非常简单,只要用ImportAttribute标记依赖的成员,MEF模块会自动找到并创建该模块。但