最近在做图片的水印功能,也就研究了一下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实现自定义相机以及图片的水印相关推荐

  1. android CameraX自定义相机使用

    android CameraX自定义相机使用 =<?xml version="1.0" encoding="utf-8"?> <android ...

  2. android使用自定义相机避开部分小米手机app调用系统相机有水印会转向的问题

    1.需求 我们要求很简单,就是拍照后显示效果要横屏拍的横着显示,竖屏拍着竖屏显示.但是我的手机小米5x等小米型号,存在横竖使用系统相机拍摄都是横屏显示的问题.更惨的是获取旋转角度什么的始终是0,没办法 ...

  3. Android Camera2自定义相机绿屏

    一.问题现象 在项目中使用Camera2自定义相机拍照,在其他手机上没有问题.在华为P40上.相机预览出现绿屏,绿屏如下所示 二.问题原因 预览设置高宽参数不符合相机高宽的话就会有绿条 原来的设置代码 ...

  4. Android之自定义ViewPager实现图片的无线轮播

    PS:以前也写过关于图片轮播这一块的博客.不过写的很烂,并且很多情况没有考虑到(没有支持无线轮播,和手势点击事件).因此这里写一篇补上.也是当时太年轻了. 注:图片请放大后再看.否则看不清楚. 学习内 ...

  5. Android 调用系统相机并加时间水印

    /**** 启动拍照*/private void capture(){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 获 ...

  6. Android关闭自定义相机拍照声音

    在自定义相机的代码中,调用 camera.takePicture(null,rawCallback,jpegCallback); 方法完成拍照时会发现无论系统的音量时震动.静音还是有声音都无法关闭自定 ...

  7. Android studio自定义相机闪光灯开启

    文章目录 前言 一.开启相机闪关灯 二.使用步骤 1.创建按钮点击事件 2.方法实现 总结 前言 自定义相机按钮实现开启和关闭闪光灯 提示:以下是本篇文章正文内容,下面案例可供参考 一.开启相机闪关灯 ...

  8. Android 自定义相机 Camera 图片方向问题

    相机预览方向问题 对于相机的预览方向我们可以通过如下API进行设置 camera.setDisplayOrientation(0); 但是,该API影响的是相机的预览方向,对于照片的保存方向并没有什么 ...

  9. Android开发自定义相机,自定义拍照界面

    1.目的 :开发时产品需求自己定义拍照界面,拍照处理.如下图:自定义一个拍照界面 可以看到,底部拍照按钮,和相册选择.整个界面和系统相机不一样.这时我们就要自己去开发定义自己的相机处理. 2.实现思路 ...

最新文章

  1. Drug Discovery Today | 频繁命中化合物机制探究:PAINS规则的局限性
  2. python26 调用mysql 5.1
  3. python代码案例详解-Python编程:案例详解输出函数print
  4. android handler,Android中Handler原理
  5. SpringMVC运行流程分析
  6. 请求参数绑定集合类型
  7. 20220203--CTF刷题WEB方向-- PHP2--考察URL编码解码和修改php后缀为phps
  8. php概率计算_替你总结一份MIT计算机课程
  9. docker从入门到实践第三版pdf_测开日常积累--Docker入门到实践
  10. 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
  11. cgroup学习(八)——CPUSET子系统
  12. 简单论坛的搭建(Discuz)、memchche、OpenResty(类nginx)
  13. 什么是 promise?
  14. 西湖大学教授怎么看AI制药革命?|量子位智库圆桌实录
  15. RHEL8.4系统镜像
  16. 【Spring Boot】使用JDBC 获取相关的数据
  17. 上次送女神死亡芭比粉口红后,我痛定思痛
  18. 深度解析:一文让你领略支付宝应用架构的厉害之处!
  19. 大数据Impala系列之初识Impala
  20. git 删除本地分支

热门文章

  1. eclipse主题样式
  2. 数学建模与MATLAB计算之005.MATLAB函数文件
  3. 僵尸毁灭工程Linux云服务器搭建(个人留档)
  4. 饿了么和汉堡王打通会员体系,联合会员模式受商家追捧!
  5. dell服务器修改mac地址,DELL品牌机MAC地址肿么改?
  6. Android消息推送:手把手教你集成小米推送
  7. 为什么天气越热,孩子体内越虚寒?
  8. 压缩pdf怎么压缩最小?苹果电脑macpdf压缩大小方法?
  9. mysql语句模糊查询_mysql模糊查询语句是什么?
  10. VMware ACE是什么?