当前位置: 首页 > news >正文

安卓开发:相机水印设置

1.更新水印

DecimalFormat DF = new DecimalFormat("#");
DecimalFormat DF1 = new DecimalFormat("#.#");LocationManager LM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, new LocationListener() {@Overridepublic void onLocationChanged(Location location) {latitude = location.getLatitude();longitude = location.getLongitude();altitude = location.getAltitude();speed = location.getSpeed();textView_longitude.setText("经度:" + DuFenMiao(longitude));textView_latitude.setText("纬度:" + DuFenMiao(latitude));textView_altitude.setText("高度:" + DF.format(altitude) + "米");if (speed * 3.6 < 10)textView_speed.setText("速度:" + DF1.format(speed * 3.6) + "千米/时");elsetextView_speed.setText("速度:" + DF.format(speed * 3.6) + "千米/时");}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}
});

2.设置水印

class ClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {int id = v.getId();switch (id) {......case R.id.button_watermark:String[] items = { "经纬度", "高度", "速度", "时间" };boolean watermark_geo = sharedPreferences.getBoolean("watermark_geo", true);boolean watermark_altitude = sharedPreferences.getBoolean("watermark_altitude", true);boolean watermark_speed = sharedPreferences.getBoolean("watermark_speed", true);boolean watermark_time = sharedPreferences.getBoolean("watermark_time", true);boolean[] check = { watermark_geo, watermark_altitude, watermark_speed, watermark_time };new AlertDialog.Builder(MainActivity.this).setTitle("水印").setMultiChoiceItems(items, check, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i, boolean b) {SharedPreferences.Editor editor = sharedPreferences.edit();switch (i) {case 0:if (b) {textView_longitude.setVisibility(View.VISIBLE);textView_latitude.setVisibility(View.VISIBLE);} else {textView_longitude.setVisibility(View.GONE);textView_latitude.setVisibility(View.GONE);}editor.putBoolean("watermark_geo", b);break;case 1:if (b)textView_altitude.setVisibility(View.VISIBLE);elsetextView_altitude.setVisibility(View.GONE);editor.putBoolean("watermark_altitude", b);break;case 2:if (b)textView_speed.setVisibility(View.VISIBLE);elsetextView_speed.setVisibility(View.GONE);editor.putBoolean("watermark_speed", b);break;case 3:editor.putBoolean("watermark_time", b);break;}editor.apply();}}).show();break;......}}
}

3.绘制水印

public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[]data, Camera camera) {Log.e(Thread.currentThread().getStackTrace()[2] + "TakePicture", "PictureCallback");Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);Camera.CameraInfo cameraInfo = new Camera.CameraInfo();Camera.getCameraInfo(ccn, cameraInfo);        Canvas canvas = new Canvas(bitmap);canvas.drawBitmap(bitmap, 0, 0, null);//水印Paint paint = new Paint();paint.setColor(Color.WHITE);paint.setTextSize(bitmap.getWidth() / 30);if (sharedPreferences.getBoolean("watermark_geo", true)) {canvas.drawText(textView_longitude.getText().toString(), 100, bitmap.getHeight() - 4 * bitmap.getWidth() / 20, paint);canvas.drawText(textView_latitude.getText().toString(), 100, bitmap.getHeight() - 3 * bitmap.getWidth() / 20, paint);}if (sharedPreferences.getBoolean("watermark_altitude", true))canvas.drawText(textView_altitude.getText().toString(), 100, bitmap.getHeight() - 2 * bitmap.getWidth() / 20, paint);if (sharedPreferences.getBoolean("watermark_speed", true))canvas.drawText(textView_speed.getText().toString(), 100, bitmap.getHeight() - bitmap.getWidth() / 20, paint);Date date = new Date();if (sharedPreferences.getBoolean("watermark_time", true))canvas.drawText(SDF1.format(date), 100, bitmap.getHeight() - 15, paint);......}
};

相关文章:

  • 【JAVA WEB实用与优化技巧】如何自己封装一个自定义UI的Swagger组件,包含Swagger如何处理JWT无状态鉴权自动TOKEN获取
  • 经典面试题:进程、线程、协程开销问题,为什么进程切换的开销比线程的大?
  • 上位机图像处理和嵌入式模块部署(f103 mcu运行freertos)
  • JVM之【运行时数据区】
  • JDK17新特性整理
  • 扫雷的技巧
  • React封装Canvas组件
  • Excel表格在线解密:轻松解密密码,快速恢复数据
  • 某大型制造集团企业信息化建设总体规划设计方案(67页PPT)
  • Java计算日期相差天数的几种方法
  • 【代码随想录37期】Day18 找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树
  • 文盘Rust -- 生命周期问题引发的 static hashmap 锁
  • flink读kafka写mysql数据库
  • 【LeetCode】【1】两数之和(1141字)
  • 美业美容院会员服务预约店铺管理小程序的效果是什么
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • HTTP--网络协议分层,http历史(二)
  • JDK9: 集成 Jshell 和 Maven 项目.
  • leetcode讲解--894. All Possible Full Binary Trees
  • MobX
  • PAT A1050
  • redis学习笔记(三):列表、集合、有序集合
  • Unix命令
  • 成为一名优秀的Developer的书单
  • 程序员最讨厌的9句话,你可有补充?
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​zookeeper集群配置与启动
  • ​马来语翻译中文去哪比较好?
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • (2.2w字)前端单元测试之Jest详解篇
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (三)Honghu Cloud云架构一定时调度平台
  • (十六)Flask之蓝图
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转) Face-Resources
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET delegate 委托 、 Event 事件
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net各种迷惑命名解释
  • .NET构架之我见
  • .ui文件相关
  • ??在JSP中,java和JavaScript如何交互?
  • @Not - Empty-Null-Blank
  • [20180129]bash显示path环境变量.txt