Android自定义相机、预览区域裁剪

本文实例为大家分享了Android自定义相机,预览区域裁剪的具体代码,供大家参考,具体内容如下

写法一:

预览区域裁剪,方法调用:

//按照比例进行裁剪头像区域
Bitmap   resultBitmap = getScaleImage(resultBitmap,
 (int) cuttingAreaView.getX(),
  (int) cuttingAreaView.getY(), 
  cuttingAreaView.getWidth(), 
  cuttingAreaView.getHeight(), 
  mSurfaceView.getWidth(), 
  mSurfaceView.getHeight());
/**
     * 按照比例裁剪图片
     *
     * @param source
     * @param cuttingAreaX  预览view的X坐标
     * @param cuttingAreaY
     * @param cuttingAreaWidth
     * @param cuttingAreaHeight
     * @param displayWidth
     * @param displayHeight
     * @return
     */
    private Bitmap getScaleImage(Bitmap source, int cuttingAreaX, int cuttingAreaY, int cuttingAreaWidth, int cuttingAreaHeight, int displayWidth, int displayHeight) {
        int sourceWidth = source.getWidth();
        int sourceHeight = source.getHeight();
        LegoLog.d("sourceWidth:" + sourceWidth + ",sourceHeight:" + sourceHeight + ",cuttingAreaX:" + cuttingAreaX + ",cuttingAreaY:" + cuttingAreaY + ",cuttingAreaWidth:" + cuttingAreaWidth + ",cuttingAreaHeight:" + cuttingAreaHeight + ",displayWidth:" + displayWidth + ",displayHeight:" + displayHeight);
        int sourceCuttingAreaX = cuttingAreaX * sourceWidth / displayWidth;
        int sourceCuttingAreaY = cuttingAreaY * sourceHeight / displayHeight;
        int sourceCuttingAreaWidth = cuttingAreaWidth * sourceWidth / displayWidth;
        int sourceCuttingAreaHeight = cuttingAreaHeight * sourceHeight / displayHeight;
        LegoLog.d("sourceWidth:" + sourceWidth + ",sourceHeight:" + sourceHeight + ",sourceCuttingAreaX:" + sourceCuttingAreaX + ",sourceCuttingAreaY:" + sourceCuttingAreaY + ",sourceCuttingAreaWidth:" + sourceCuttingAreaWidth + ",sourceCuttingAreaHeight:" + sourceCuttingAreaHeight);
        return Bitmap.createBitmap(source, sourceCuttingAreaX, sourceCuttingAreaY, sourceCuttingAreaWidth, sourceCuttingAreaHeight, null, false);
    }

其他方法:

private void initParameters(Camera camera) {
        try {
            mParameters = camera.getParameters();
            mParameters.setPreviewFormat(ImageFormat.NV21);
            //获取与指定宽高相等或最接近的尺寸
            //设置预览尺寸
            Camera.Size bestPreviewSize = getBestSize(mSurfaceView.getWidth(), mSurfaceView.getHeight(), mParameters.getSupportedPreviewSizes());
            if (bestPreviewSize != null) {
                mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height);
            }
            //设置保存图片尺寸
            Camera.Size bestPicSize = getBestSize(PIC_WIDTH, PIC_HEIGHT, mParameters.getSupportedPictureSizes());
            if (bestPicSize != null) {
                mParameters.setPictureSize(bestPicSize.width, bestPicSize.height);
            }
            //对焦模式
            if (isSupportFocus(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
                mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            }
            camera.setParameters(mParameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private Camera.Size getBestSize(int targetWidth, int targetHeight, List<Camera.Size> sizeList) {
        Camera.Size bestSize = null;
        float targetRatio = ((float) targetHeight / targetWidth);  //目标大小的宽高比
        float minDiff = targetRatio;
        for (Camera.Size size : sizeList) {
            if (size.width == targetHeight && size.height == targetWidth) {
                bestSize = size;
                break;
            }
            float supportedRatio = (float) size.width / size.height;
            if (Math.abs(supportedRatio - targetRatio) < minDiff) {
                minDiff = Math.abs(supportedRatio - targetRatio);
                bestSize = size;
            }
        }
        return bestSize;
    }

参考【人车核验】CaptureManager.java

写法二:

Bitmap bitmap = BitmapFactory.decodeFile(originalFile.getPath());//原图

//计算裁剪位置
float left, top, right, bottom;
left = (float) scanView.getLeft() / (float) cameraPreview.getWidth();
top = ((float) containerView.getTop() - (float) cameraPreview.getTop()) / (float) cameraPreview.getHeight();
right = (float) scanView.getRight() / (float) cameraPreview.getWidth();
bottom = (float) containerView.getBottom() / (float) cameraPreview.getHeight();

//裁剪及保存到文件
Bitmap cropBitmap = Bitmap.createBitmap(bitmap,
      (int) (left * (float) bitmap.getWidth()),
      (int) (top * (float) bitmap.getHeight()),
      (int) ((right - left) * (float) bitmap.getWidth()),
      (int) ((bottom - top) * (float) bitmap.getHeight()));

参考:MobileCheck

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android快速实现无预览拍照功能

    本文实例为大家分享了Android实现无预览拍照功能的具体代码,供大家参考,具体内容如下 实现思路: 把预览的SurfaceView的宽高设置为肉眼看不出的值,例如0.1dp,其他的就是自定义相机的标准步骤了! 当然,网上自定义相机的文章多的去了,我是不可能再做老生常谈的事的,在这里我推荐一个很好用的第三方库,也许很多人已经了解过并且用过,没用过的同学可以试试,亲测好用. 废话不多说,先上源码地址 这里简单介绍一下用法: 1.在gradle里添加库的依赖:compile 'com.wonderk

  • Android编程中调用Camera时预览画面有旋转问题的解决方法

    本文实例讲述了Android编程中调用Camera时预览画面有旋转问题的解决方法.分享给大家供大家参考,具体如下: 在调用Camera写应用的时候,前后摄像头的情况有时候是不一样的.有时候,明明后摄像头没有问题,而调用到前摄像头时,却倒转了180°,或者其他角度,百思不得其解.在查看了Android源码之后,发现它的解决办法很是好,接下来贴个源码,以备日后查看. public static int getDisplayRotation(Activity activity) { int rotat

  • Android多种方式实现相机圆形预览的示例代码

    效果图如下: 一.为预览控件设置圆角 为控件设置ViewOutlineProvider public RoundTextureView(Context context, AttributeSet attrs) { super(context, attrs); setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { Rect rect

  • Android CameraX 打开摄像头预览功能

    目标很简单,用CameraX打开摄像头预览,实时显示在界面上.看看CameraX有没有Google说的那么好用.先按最简单的来,把预览显示出来. 引入依赖 模块gradle的一些配置,使用的Android SDK版本为31,启用了databinding apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plug

  • Android实现Camera2预览和拍照效果

    简介 网上对于 Camera2 的介绍有很多,在 Github 上也有很多关于 Camera2 的封装库,但是对于那些库,封装性太强,有时候我们仅仅是需要个简简单单的拍照功能而已,因此,自定义一个 Camera 使之变得轻量级那是非常重要的了.(本文并非重复造轮子, 而是在于学习 Camera2API 的基本功能, 笔记之.) 学习要点: 使用 Android Camera2 API 的基本功能. 迭代连接到设备的所有相机的特征. 显示相机预览和拍摄照片. Camera2 API 为连接到 An

  • Android Camera1实现预览框显示

    本文实例为大家分享了Android Camera1实现预览框显示的具体代码,供大家参考,具体内容如下 Android要预览Camer界面其实非常简单,只需要几句话就行. 1.首先要再AndroidManifest.xml中添加权限 <uses-permission android:name="android.permission.CAMERA"/> 2.创建一个xml包含控件TextureView 比如activity_main.xml: <?xml version=

  • Android Camera2 实现预览功能

    1. 概述 最近在做一些关于人脸识别的项目,需要用到 Android 相机的预览功能.网上查阅相关资料后,发现 Android 5.0 及以后的版本中,原有的 Camera API 已经被 Camera2 API 所取代. 全新的 Camera2 在 Camera 的基础上进行了改造,大幅提升了 Android 系统的拍照功能.它通过以下几个类与方法来实现相机预览时的工作过程: •CameraManager :摄像头管理器,主要用于检测系统摄像头.打开系统摄像头等: •CameraDevice

  • Android CameraX打开摄像头预览教程

    目录 前言 引入依赖 权限 界面 开启预览 运行测试 增加开关 小结 前言 目标很简单,用CameraX打开摄像头预览,实时显示在界面上.看看CameraX有没有Google说的那么好用.先按最简单的来,把预览显示出来. 引入依赖 模块gradle的一些配置,使用的Android SDK版本为31,启用了databinding apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin:

  • Android实现图片预览与保存功能

    目录 前言 引入插件 总结 前言 在App开发中,通常为了省流提高加载速度提升用户体验我们通常在列表中或新闻中的插图都是以缩略图压缩过的图片来进行展示,当用户点击图片时我们再去加载真正像素的大图让用户预览,如果用户想保存并且可以保存到自己的相册中,那么在Flutter中如何实现这样的功能,看完这篇文章让你1分钟瞬间实现. 引入插件 首先,我们需要引入强大的Flutter社区中的两个插件,分别是: photo_view: ^0.13.0 用来加载查看大图. image_gallery_saver:

  • Android camera实时预览 实时处理,人脸识别示例

    Android camera实时预览 实时处理,面部认证. 预览操作是网友共享的代码,我在继承SurfaceView 的CameraSurfaceView 中加入了帧监听事件,每次预览监听前五个数据帧,在处理做一个面部识别. 先看目录关系 自定义控件CameraSurfaceView.java 自定义接口方法CameraInterface.java CameraActivity预览界面. CameraSurfaceView.Java package com.centaur.camera.prev

随机推荐