android实现自定义相机以及图片的水印
最近在做图片的水印功能,也就研究了一下android的相机。在android中有两种方式可以进行拍照,一种是调用系统的拍照功能调用方式比较简单而且不需要权限。
调用方式:
//照相机中获取照片public void getPhoto_FromCamera() {try {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 下面这句指定调用相机拍照后的照片存储的路径intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "photo.jpg")));startActivityForResult(intent, 1);} catch (ActivityNotFoundException e) {e.printStackTrace();}}
这样在activity的回掉取出图片设置到我们的imageView就可以了。so easy!
接下来是自定义相机实现图片的拍照效果:
package qjdt.iwintrue.com.cameraapplication;import android.content.Intent;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class CustomerCameraActivity extends AppCompatActivity implements SurfaceHolder.Callback {//声明一个camera对象private Camera camera;//图片的实时预览private SurfaceView suf_camera;private SurfaceHolder surfaceHolder;//相机参数设置private Camera.Parameters parameters;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_customer_camera);suf_camera = (SurfaceView) findViewById(R.id.suf_camera);surfaceHolder = suf_camera.getHolder();surfaceHolder.addCallback(this);}public void click(View view) {switch (view.getId()){case R.id.btn_start:takePhoto();break;case R.id.btn_stop:break;}}public void takePhoto(){parameters = camera.getParameters();//设置照片格式parameters.setPictureFormat(ImageFormat.JPEG);parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);parameters.setPictureSize(400, 800);camera.autoFocus(new Camera.AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {camera.takePicture(null, null, new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {try {FileOutputStream fileOutputStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"temp.jpeg"));fileOutputStream.write(data);fileOutputStream.close();Intent intent = new Intent(CustomerCameraActivity.this,ResultActivity.class);startActivity(intent);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});}});
// camera.takePicture();}public void getCamera(){//获取相机实例if(camera==null)camera = Camera.open();}public void releaseCamera(){if(camera!=null){camera.setPreviewCallback(null);camera.stopPreview();camera.release();camera = null;}}public void setPrive(Camera camera,SurfaceHolder surfaceHolder){try {camera.setPreviewDisplay(surfaceHolder);//开始预览camera.setDisplayOrientation(90);camera.startPreview();} catch (IOException e) {e.printStackTrace();}}@Overrideprotected void onResume() {super.onResume();getCamera();if(surfaceHolder!=null){setPrive(camera,surfaceHolder);}}@Overrideprotected void onPause() {super.onPause();releaseCamera();}@Overridepublic void surfaceCreated(SurfaceHolder holder) {setPrive(camera,surfaceHolder);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {camera.stopPreview();setPrive(camera, surfaceHolder);}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {releaseCamera();}
}
ResultActivity中就是一个ImageView来显示这张图片就不贴了。另外别往了加权限
对于图片的水印效果也很简单,就是当我们得倒bitmap的时候利用paint和Canvas来
重新绘制一张bitmap参考方法如下:
// 加水印 也可以加文字public static Bitmap watermarkBitmap(Bitmap src, Bitmap watermark,String title) {if (src == null) {return null;}int w = src.getWidth();int h = src.getHeight();//需要处理图片太大造成的内存超过的问题,这里我的图片很小所以不写相应代码了Bitmap newb= Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图Canvas cv = new Canvas(newb);cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入srcPaint paint=new Paint();//加入图片if (watermark != null) {int ww = watermark.getWidth();int wh = watermark.getHeight();paint.setAlpha(50);cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, paint);// 在src的右下角画入水印}//加入文字if(title!=null){String familyName ="黑体";Typeface font = Typeface.create(familyName,Typeface.NORMAL);TextPaint textPaint=new TextPaint();textPaint.setColor(Color.RED);textPaint.setTypeface(font);textPaint.setTextSize(100);//这里是自动换行的StaticLayout layout = new StaticLayout(title,textPaint,w,Layout.Alignment.ALIGN_NORMAL,1.0F,0.0F,true);layout.draw(cv);}cv.save(Canvas.ALL_SAVE_FLAG);// 保存cv.restore();// 存储return newb;}
通过这个方法你就可以对你的bitmap添加文字或者图片了。
android实现自定义相机以及图片的水印相关推荐
- android CameraX自定义相机使用
android CameraX自定义相机使用 =<?xml version="1.0" encoding="utf-8"?> <android ...
- android使用自定义相机避开部分小米手机app调用系统相机有水印会转向的问题
1.需求 我们要求很简单,就是拍照后显示效果要横屏拍的横着显示,竖屏拍着竖屏显示.但是我的手机小米5x等小米型号,存在横竖使用系统相机拍摄都是横屏显示的问题.更惨的是获取旋转角度什么的始终是0,没办法 ...
- Android Camera2自定义相机绿屏
一.问题现象 在项目中使用Camera2自定义相机拍照,在其他手机上没有问题.在华为P40上.相机预览出现绿屏,绿屏如下所示 二.问题原因 预览设置高宽参数不符合相机高宽的话就会有绿条 原来的设置代码 ...
- Android之自定义ViewPager实现图片的无线轮播
PS:以前也写过关于图片轮播这一块的博客.不过写的很烂,并且很多情况没有考虑到(没有支持无线轮播,和手势点击事件).因此这里写一篇补上.也是当时太年轻了. 注:图片请放大后再看.否则看不清楚. 学习内 ...
- Android 调用系统相机并加时间水印
/**** 启动拍照*/private void capture(){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 获 ...
- Android关闭自定义相机拍照声音
在自定义相机的代码中,调用 camera.takePicture(null,rawCallback,jpegCallback); 方法完成拍照时会发现无论系统的音量时震动.静音还是有声音都无法关闭自定 ...
- Android studio自定义相机闪光灯开启
文章目录 前言 一.开启相机闪关灯 二.使用步骤 1.创建按钮点击事件 2.方法实现 总结 前言 自定义相机按钮实现开启和关闭闪光灯 提示:以下是本篇文章正文内容,下面案例可供参考 一.开启相机闪关灯 ...
- Android 自定义相机 Camera 图片方向问题
相机预览方向问题 对于相机的预览方向我们可以通过如下API进行设置 camera.setDisplayOrientation(0); 但是,该API影响的是相机的预览方向,对于照片的保存方向并没有什么 ...
- Android开发自定义相机,自定义拍照界面
1.目的 :开发时产品需求自己定义拍照界面,拍照处理.如下图:自定义一个拍照界面 可以看到,底部拍照按钮,和相册选择.整个界面和系统相机不一样.这时我们就要自己去开发定义自己的相机处理. 2.实现思路 ...
最新文章
- Drug Discovery Today | 频繁命中化合物机制探究:PAINS规则的局限性
- python26 调用mysql 5.1
- python代码案例详解-Python编程:案例详解输出函数print
- android handler,Android中Handler原理
- SpringMVC运行流程分析
- 请求参数绑定集合类型
- 20220203--CTF刷题WEB方向-- PHP2--考察URL编码解码和修改php后缀为phps
- php概率计算_替你总结一份MIT计算机课程
- docker从入门到实践第三版pdf_测开日常积累--Docker入门到实践
- 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
- cgroup学习(八)——CPUSET子系统
- 简单论坛的搭建(Discuz)、memchche、OpenResty(类nginx)
- 什么是 promise?
- 西湖大学教授怎么看AI制药革命?|量子位智库圆桌实录
- RHEL8.4系统镜像
- 【Spring Boot】使用JDBC 获取相关的数据
- 上次送女神死亡芭比粉口红后,我痛定思痛
- 深度解析:一文让你领略支付宝应用架构的厉害之处!
- 大数据Impala系列之初识Impala
- git 删除本地分支