安卓开发:相机水印设置

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() {
    @Override
    public 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) + "千米/时");
        else
            textView_speed.setText("速度:" + DF.format(speed * 3.6) + "千米/时");
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}

    @Override
    public void onProviderEnabled(String provider) {}

    @Override
    public void onProviderDisabled(String provider) {}
});

2.设置水印

class ClickListener implements View.OnClickListener {
    @Override
    public 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() {
                @Override
                public 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);
                        else
                            textView_altitude.setVisibility(View.GONE);
                        editor.putBoolean("watermark_altitude", b);
                        break;
                    case 2:
                        if (b)
                            textView_speed.setVisibility(View.VISIBLE);
                        else
                            textView_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() {
    @Override
    public 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);
        ......
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648201.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++的数论相关算法

数论是数学的一个分支&#xff0c;主要研究整数的性质和关系。在计算机科学中&#xff0c;数论算法对于密码学、优化问题和算法分析等方面都具有重要作用。C作为一种高效的编程语言&#xff0c;非常适合用来实现这些算法。下面我们将介绍几个C中的数论相关算法&#xff0c;包括…

如何学习计算机网络(超详细,方法论)

分享一下学习计算机网络的方法论 首先是看视频&#xff1a; 这里我推荐中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版》课程 课程目标_哔哩哔哩_bilibili 教材采用神书《计算机网络&#xff08;自顶向下方法&#xff09;》&#xff0c;授课风格更偏向实…

Linux基础 (十):Linux 信号的使用

目录 一、信号的基本概念 二、信号处理常见方式概览 三、修改信号的响应方式 – signal() 3.1 简单复习结束前台进程 3.2 改变SIGINT信号的响应方式 3.3 自定义方式改变进程对信号的响应 3.4 进程对信号作出两种响应 四、发送信号 – kill() 五、利用信号解决僵死进程…

全球点赞最高的人颜廷利:真正的人生目标是什么

在那个充满生机的2024年春天&#xff0c;记者有幸对中国第一起名大师的老师颜廷利教授进行了深入的访谈。带着对其人生哲学的强烈好奇&#xff0c;记者紧张而期待地提出了问题&#xff1a;“颜教授&#xff0c;您在漫长的人生旅途中最追求的是什么&#xff1f;” 宁夏银川、山东…

从容应对亿级QPS访问,Redis还缺少什么?no.29

众所周知&#xff0c;Redis 在线上实际运行时&#xff0c;面对海量数据、高并发访问&#xff0c;会遇到不少问题&#xff0c;需要进行针对性扩展及优化。本课时&#xff0c;我会结合微博在使用 Redis 中遇到的问题&#xff0c;来分析如何在生产环境下对 Redis 进行扩展改造&…

IT廉连看——UniApp——条件渲染

IT廉连看——UniApp——条件渲染 什么是条件渲染&#xff1f; 顾名思义&#xff0c;满足一定的条件他才会进行渲染。 这是我们上节事件绑定保留的代码。 一、现在我有这样一个需求&#xff1a; 增加一个按钮&#xff0c;当我点击这个按钮&#xff0c;这里的文本&#xff0…

2024年上半年系统架构设计师真题-复原程度90%

前言 此次考试监考特别严格&#xff0c;草稿纸不允许带出考场&#xff0c;并且准考证上不允许任何写画&#xff0c;甚至连笔都允许带一支&#xff0c;所以下面的相关题目都是参考一些群友的提供&#xff0c;加上自己的记忆回顾&#xff0c;得到的结果。 其中综合知识部分的题…

NASA数据集——阿尔法喷气式大气实验二氧化碳和甲烷数据

Alpha Jet Atmospheric eXperiment Carbon Dioxide and Methane Data 阿尔法喷气式大气实验二氧化碳和甲烷数据 简介 Alpha Jet Atmospheric eXperiment (AJAX) 是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达…

android_binder源码分析之_binder驱动使用服务

一&#xff0c;binder驱动源码分析&#xff0c;使用服务过程 uint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name) {uint32_t handle;unsigned iodata[512/4];struct binder_io msg, reply;bio_init(&msg, iodata, sizeof(iodata), 4);b…

Layui设置table表格中时间的显示格式

1、问题概述? 【数据库中的时间格式】 【Layui中table表格默认的显示格式】 默认的格式中会显示时间的毫秒单位,但是这个毫秒有时候是不需要的。 总结:这个时候我们就需要定义table表格中的时间显示格式。 2、解决办法? 【解决后时间的显示格式】 【解决办法1:通过字符…

mvc的常见注解

问文心一言的&#xff0c;记录一下。 PathVariable 路径变量注解 PathVariable 是 Spring MVC 提供的一个注解&#xff0c;它用于从 URI 模板变量中绑定值到控制器方法的参数上。当你在 RequestMapping、GetMapping、PostMapping、PutMapping、DeleteMapping 等注解的 URL 路…

企业档案管理系统软件都有哪些分类

企业档案管理系统软件可以根据其功能和特点进行分类。以下是一些常见的分类&#xff1a; 1. 全能类档案管理系统&#xff1a;提供文件存储和检索功能&#xff0c;并支持多种文件类型和格式的管理&#xff0c;如文本文件、图像文件、音频文件等。 2. 电子档案管理系统&#xff1…

嵌入式进阶——电位器案例(ADC)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 案例介绍万用表测量ADC概念代码实现IO初始化为高阻输入ADC配置逻辑数据读取与转换 反向得到电源输入电压 案例介绍 通过控制滑动变…

设计模式:命令模式(Command)

设计模式&#xff1a;命令模式&#xff08;Command&#xff09; 设计模式&#xff1a;命令模式&#xff08;Command&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例实例 1&#xff1a;餐厅…

探索移动云服务:构建高效移动互联网应用的最佳实践

一、移动云服务简介 官网&#xff1a;https://ecloud.10086.cn 移动云&#xff0c;或称为移动云计算&#xff0c;是通过无线网络向移动设备用户提供云计算服务的技术。它使用户能够通过智能手机、平板电脑和笔记本电脑等各类移动设备&#xff0c;在任何时间、任何地点便捷地访…

通过Function函数式方式创建React组件-8

在React中&#xff0c;V16版本之前有三种方式创建组件&#xff08;createClass() 被删除了)&#xff0c;之后只有两种方式创建组件。这两种方式的组件创建方式效果基本相同&#xff0c;但还是有一些区别&#xff0c;这两种方法在体如下&#xff1a; 本节先了解下用Function函数…

机器学习算法手撕(一):KD树

import math import matplotlib.pyplot as pltclass Node:def __init__(self, data, leftNone, rightNone):self.data dataself.left leftself.right right# 创建KDTree类 class KDTree:def __init__(self, k):self.k kdef create_tree(self,dataset,depth):if not dataset…

【DAOS】daos client和dfuse 是什么?

目录 什么是daos client dfuse 是什么 dfuse 和 FUSE 之间的关系 什么是daos client &#xff08;参加&#xff1a;DAOS: A Scale-Out High Performance Storage Stack for Storage Class Memory | SpringerLink&#xff09; DAOS Client是一个与应用程序集成的库。 从堆栈…

堆(建堆算法,堆排序)

目录 一.什么是堆&#xff1f; 1.堆 2.堆的储存 二.堆结构的创建 1.头文件的声明&#xff1a; 2.向上调整 3.向下调整 4.源码&#xff1a; 三.建堆算法 1.向上建堆法 2.向下建堆法 四.堆排序 五.在文件中Top出最小的K个数 一.什么是堆&#xff1f; 1.堆 堆就…

【docker】仓库harbor的部署

harbor介绍 Harbor 是一个用于存储和管理 Docker 镜像的开源仓库。它提供了一系列的功能&#xff0c;比如用户管理、访问控制、镜像管理、日志审计和安全扫描等。Harbor 可以作为私有仓库来使用&#xff0c;也可以与公有仓库&#xff08;如 Docker Hub&#xff09;集成使用。 …