在surfaceView上添加一个矩形框的功能

Android开发 摄像头SurfaceView预览 背景带矩形框 实现(原理 双surfaceview,顶层画矩形框, 阅读详情

这几天看了很多大神写的在surfaceView上添加一个矩形框的功能 ,我自己也写了一个类似的简单功能实现,目前还有个技术难题没有实现,有那个大神看到这篇文章麻烦现身指点一二,别的不多说了 代码先贴出来,问题后面在问!

先写一个相机类:(我有一部分是用afinal快速框架开发的,比较方便,推荐大家都使用下!)

package com.example.cameratest;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


import net.tsz.afinal.FinalActivity;
import net.tsz.afinal.annotation.view.ViewInject;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;


public class CameraActivity extends FinalActivity {


	@ViewInject(id = R.id.buttonLayout)View layout;
	@ViewInject(id = R.id.surfaceview,click = "focusing")SurfaceView surfaceView;


	private Camera camera;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
//        layout.getBackground().setAlpha(150);//这里可以给背景添加透明度
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().setFixedSize(640, 480);
        surfaceView.getHolder().setKeepScreenOn(true);
        surfaceView.getHolder().addCallback(new SurfaceCallBack());
    }
    
    /**
     * 拍照点击事件
     * @param view
     */
    public void takepicture(View view){
    	if(camera!=null){
    		camera.takePicture(null, null, new MypictureCallback());
    	}
    }
    /**
     * 聚焦点击事件
     * @param view
     */
    public void focusing(View view){
    	if(camera!=null){
    		camera.autoFocus(new MyAutoFocusCallback());
    	}
    }
    
    /**
     * 聚焦点击事件内部类
     * @author wanglei
     *
     */
    private final class MyAutoFocusCallback implements AutoFocusCallback{


		@Override
		public void onAutoFocus(boolean success, Camera camera) {
			// TODO Auto-generated method stub
			if(success){
				Log.i("main", "对焦完成");
				camera.takePicture(null, null, new MypictureCallback());
			}else{
				Log.i("main", "对焦else");
			}
		}
    	
    }
    
    /**
     * 拍照事件内部类
     * @author wanglei
     *
     */
    private final class MypictureCallback implements PictureCallback{


		@Override
		/**
		 * @param data 传过来的jpg
		 * @param camera 摄像头
		 */
		public void onPictureTaken(byte[] data, Camera camera) {
			try {
				File jpgFile = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
				FileOutputStream outputStream = new FileOutputStream(jpgFile);
				outputStream.write(data);
				outputStream.close();
				camera.startPreview();//开始预览
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
    }
    
    /**
     * 打开相机内部类
     * @author wanglei
     *
     */
    private final class SurfaceCallBack implements Callback{
    	@Override
    	public void surfaceCreated(SurfaceHolder holder) {
    		try {
				camera = Camera.open(); //打开摄像头
				Camera.Parameters parameters = camera.getParameters();
//    			Log.i("main", "摄像头的各项参数:"+parameters.flatten());
				parameters.setPreviewSize(640, 480);//摄像头的像素
//				parameters.setPreviewFrameRate(5);//摄像头每秒获得5个画面
				parameters.setPictureSize(640, 480);//拍摄出照片的大小
				parameters.setPictureFormat(PixelFormat.JPEG);
				parameters.setJpegQuality(100);//jpg图片的质量
				parameters.setRotation(90);//相机旋转90度
				camera.setParameters(parameters);//把参数设回给摄像头
				camera.setPreviewDisplay(holder);//设置显示摄像头捕获的画面
				camera.setDisplayOrientation(90);//旋转90度解决相机反向问题
				camera.startPreview();//开始预览
				
			} catch (IOException e) {
				e.printStackTrace();
			}
    		
    	}
    	@Override
    	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    		
    	}
    	@Override
    	/**
    	 * 关闭摄像头
    	 */
    	public void surfaceDestroyed(SurfaceHolder holder) {
     		if(camera!=null){
     			camera.stopPreview();
     			camera.release();
     			camera = null;
     			Log.i("main", "摄像头关闭");
     		}
    	}
    }
}

然后是在上面层的view类:

package com.example.cameratest;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;


public class MyView extends View {


	private int x = 50;
	private int y = 50;
	private int w = 210;
	private int h = 150;


	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		setLongClickable(true);
		this.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
//就是这里 各位大神 我想写个类似于系统自带的图片裁剪框的那个功能 不知怎么实现
				v.invalidate();
				return false;
			}
		});
	}


	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		Paint paint = new Paint(); // 笔触
		paint.setAntiAlias(true); // 反锯齿
		paint.setColor(Color.WHITE);
		paint.setStyle(Paint.Style.STROKE);
		paint.setStrokeWidth(5);
		canvas.drawRect(x, y, w, h, paint);
		Log.i("mian", "--------->>执行: x=" + x + " | y=" + y +" | w="+ w + " | h=" + h);
		super.onDraw(canvas);
	}
}


布局文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF" >


    <SurfaceView
        android:id="@+id/surfaceview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <RelativeLayout
        android:id="@+id/buttonLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" ><!-- 布局这里可以添加背景 -->


        <com.example.cameratest.MyView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>


</FrameLayout>

清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.cameratest"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />


    <!-- 访问照相机的权限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- sd卡读写数据目录的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 自动对焦的权限 -->
    <uses-feature android:name="android.hardware.camera.autofocus" />


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- android:screenOrientation:固定屏幕显示方向 -->
        <activity
            android:name=".CameraActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar" >
        </activity>
    </application>


</manifest>
各位大神我想在view的基础上添加个类似于android系统在带的图片裁剪框,可以手动调整大小的那种,希望能给点思路!谢谢。

Android摄像头 只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理 底层Surface 阅读详情

相关推荐

android人脸检测并画框demo

1. 人脸检测。 2. 自定义图片质量参数,包括最小识别人脸,光亮度,模糊度等。 3.自定义画人脸框,可以替换成任意图片。

android摄像头矩形框提取_在SurfaceView中添加一个红色矩形框捕捉图像

在拍照进行图像处理的过程中,有时为了提高处理速度,我们不需要对整幅图片进行处理,而是对图像的一部分特定的区域进行处理,这时就需要知道我们选取的部分是否包含了整个我我们需要的图像部分。为了直观的表示,我们可以在预览框中添加一个矩形红框,用这个矩形框框住我们需要的图像部分,就能确保我们能够获取到整个信息,剪切掉不需要的那部分图像,同时又能提高处理速度。真机测试时,黑色部分会变成预览框。真个过程分为以下...

weixin_39890543的博客 726

android surfaceview自定义拍照 绘制头像轮廓

android surfaceview自定义拍照 绘制头像轮廓 注明:是借用网上的demo基础上进行修改的

Android开发 摄像头SurfaceView预览 背景带矩形框 实现(原理:双surfaceview,顶层画矩形框,底层预览视频)...

为了能在摄像头预览的时候,背景有个矩形框、或一些坐标、横线来标示关键位置,真让杂家费劲心思了。苦苦研究了两天,毫无进展。baidu了若干资料,大都是提出这个问题,但怎么解决的没有说,都不了了之。后来转而google,又研究了两天,终于完美解决啦! 1,网上介绍的摄像头预览,一般是用一个surfaceview,为了能让其正常预览视频,设置属性 mySurfaceView.setZOrderOn...

分享技术干货和灵感 1013

2 海康视觉平台VisionMaster 上手系列:大纲及准备

海康视觉平台VisionMaster 大纲,课前准备 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 1万+

π_RL:解锁流匹配VLA强化学习后训练的关键技术与实战解析

本文深入解析了π_RL框架如何通过流匹配(flow matching)与强化学习(RL)的结合,解决视觉语言动作模型(VLA)在后训练中的关键挑战。详细介绍了Flow Noise和Flow SDE两大核心技术,以及它们在机器人控制任务中的实战效果,显著提升了模型的性能、数据效率和泛化能力。

weixin_29061531的博客 220

Android图形图画学习(9)——探索SurfaceView的框架结构

上图是实现SurfaceView绘图的框架。我们需要实现的是长横线以下的部分。 对这个框架作一个说明: 回调的典型作用是实现控制反转,即事先预定好框架,在SurfaceView.java的updateWindow()函数中,根据实际情况,系统会调用SurfaceHolder.Callback.surfaceCreated(mSurfaceHolder)等。这只是一个框架,在没有实现的Surfa

u012604322的专栏 1400

手把手实战:RK3588上YOLOv8模型从训练到部署全流程解析

本文详细解析了在RK3588开发板上部署YOLOv8目标检测模型的全流程。从模型训练、正确导出适配的ONNX格式,到使用RKNN-Toolkit2进行模型转换与量化,最后在板卡上完成部署与性能测试。文章提供了完整的代码示例和关键避坑指南,帮助开发者高效实现嵌入式AI应用落地。

weixin_28224217的博客 401

android摄像头矩形框提取_Android开发 摄像头SurfaceView预览 背景带矩形框 实现(原理:双surfaceview,顶层画矩形框,底层预览视频)...

为了能在摄像头预览的时候,背景有个矩形框、或一些坐标、横线来标示关键位置,真让杂家费劲心思了。苦苦研究了两天,毫无进展。baidu了若干资料,大都是提出这个问题,但怎么解决的没有说,都不了了之。后来转而google,又研究了两天,终于完美解决啦!1,网上介绍的摄像头预览,一般是用一个surfaceview,为了能让其正常预览视频,设置属性mySurfaceView.setZOrderOnTop(t...

weixin_30767365的博客 509

Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台

本文以诺依项目为例详细记录了Kubernetes集群的部署过程以及配套DevOps环境的搭建。主要内容包括:1) 配置8个节点的软硬件环境;2) 基础环境准备(网络、防火墙、Docker等);3) 三节点Kubernetes集群部署;4) GitLab代码仓库安装;5) Harbor私有镜像仓库搭建;6) Jenkins持续集成工具配置;7) 基于若依项目的CI/CD实践;8) Rancher集群管理工具部署。

hickman2023的博客 1201

Windows平台COLMAP实战:从零到三维重建的避坑指南

本文详细介绍了在Windows平台上使用COLMAP进行三维重建的完整流程,包括安装指南、数据准备技巧、图形界面操作及常见问题解决方案。特别针对Windows用户提供了CUDA版本与非CUDA版本的性能对比,帮助用户高效完成从照片到三维模型的重建过程。

weixin_29090677的博客 187

Android开发 摄像头SurfaceView预览 背景带矩形框 实现(原理:双surfaceview,顶层画矩形框,底层预览视频)

为了能在摄像头预览的时候,背景有个矩形框、或一些坐标、横线来标示关键位置,真让杂家费劲心思了。苦苦研究了两天,毫无进展。baidu了若干资料,大都是提出这个问题,但怎么解决的没有说,都不了了之。后来转而google,又研究了两天,终于完美解决啦! 1,网上介绍的摄像头预览,一般是用一个surfaceview,为了能让其正常预览视频,设置属性        mySurfaceView.setZO

yanzi1225627的专栏 5万+

【ComfyUI报错解决】K采样器 mat1和mat2形状不匹配错误分析与修复 mat1 and mat2 shapes cannot be multiplied (77x2048 and 4096x

如果你在 ComfyUI 里遇到K采样器报错:mat1 和 mat2 shapes cannot be multiplied确认大模型和 LoRA 是否是同一版本(SDXL vs SD1.5,不能混用)。如果用了双 CLIP 加载器,要确认加载的类型和选择的模型类型是否匹配。加载→ 类型选flux加载 SDXL 专用的 clip/t5 → 类型选sdxl避免不同版本模型和 LoRA 混搭,保持一致性。模型+LoRA+CLIP 类型必须保持同一版本,不然就会报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2404

只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 2013-02-13 11:54 13061人阅读 评论(69) 收藏 举报 目录(?)[+] Android开发 摄像头SurfaceView预览 背景带矩形框 实现

a982912320的专栏 2974

STM32F103(二十三)通用同步异步收发器(USART)

学习板:STM32F103ZET6 往期博客: STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 STM32F103五分钟入门系列(三)GPIO的常用库函数使用方法总结+一个网络上的误区 STM32F103五分钟入门系列(四)蜂鸣器实验(库函数+寄存器) STM32F103五分钟入门系列(五)按键实验(库函数+寄存器) STM32F103五分钟入门系列(六)时钟框图+相关寄存器

Curnane0_0的博客 1014

[特殊字符] RK3588 平台上基于 Panfrost 的 Mesa 驱动编译全过程

摘要: 本文详细记录了在RK3588平台(Ubuntu 20.04 aarch64)上编译基于Panfrost的Mesa驱动的全过程。内容包括:1)系统依赖安装;2)libdrm编译;3)Mesa配置参数优化;4)LLVM 15与SPIRV工具链的安装方法;5)SPIRV-Tools版本问题的解决方案;6)最终编译命令及常见错误处理。关键点在于正确设置工具链路径(PKG_CONFIG_PATH)和版本匹配(LLVM 15对应SPIRV-LLVM-Translator v15.0.0),推荐将组件安装在/op

梁俊星的博客 936

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)

【后注:】下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数。看前文的第四条。Y的,省的说我传的代码不能用   最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在前文(Android开发 摄像头SurfaceView预览 背景带矩形框 实现(原理:双surfaceview,顶层画矩形框,底层预览视频))----http://blog.

yanzi1225627的专栏 5万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)...

最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在前文( Android开发 摄像头SurfaceView预览 背景带矩形框 实现(原理:双surfaceview,顶层画矩形框,底层预览视频) )----http://blog.youkuaiyun.com/yanzi1225627/article/details/7934710已经实现。最近发现上层绘制矩形框,用...

既是过河之卒,惟有奋力向前。 285

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

摄像头预览的背景带矩形框效果的实现(原理:双surfaceview,顶层画矩形框,底层预览视频)

为了能在摄像头预览的时候,背景有个矩形框、或一些坐标、横线来标示关键位置,真让杂家费劲心思了。苦苦研究了两天,毫无进展。baidu了若干资料,大都是提出这个问题,但怎么解决的没有说,都不了了之。后来转而google,又研究了两天,终于完美解决啦! 1,网上介绍的摄像头预览,一般是用一个surfaceview,为了能让其正常预览视频,设置属性        mySurfaceView.setZO

好记性不如写博客! 2517

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android SurfaceView 拍照时显示参照矩形框

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 2013-02-13 11:54 34368人阅读 评论(86) 收藏 举报 本文章已收录于:   Android知识库  分类: Android开发(128)  版权声明:本文为

tiankongtiankong01的博客 1万+
上一篇: 谷歌公布各版本Android份额 2.3占半壁江山
下一篇: 关于android自定义相机连续对焦功能的个人见解
Return_Code
博客等级 码龄14年 8粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值