就是仿照现在扫一扫的形式,周围是半透明的遮挡,然后中间是全透明的,拍摄后只截取框内的内容
查了很多博客,实现起来真的太复杂了,本人比较怕麻烦所以在很多地方偷懒了
先上效果图:
第一步:设置照相机预览以及拍照
这是所有步骤的前提,没有预览,用户怎么知道自己拍的什么呢。预览用的是SurfaceView
这篇博文写得已经十分详细了,打开照相机,然后拍照,而且十分简洁!不想别的博客一下就几百行代码不知所云。这篇代码可以复制下去当相机模版使用。
这里遇到一个问题,就是预览的效果是左转90度的,拍出来也是左转90度的,查了很多资料,大家统一的做法就是。在相机预览那里设置右旋90度,拍下的照片再右旋90度,具体的做法我会贴代码
第二步:设置半透明边框
很多博客的做法是绘图呀什么的,太过负责。
其实如果考虑简单点的话,只要在surfaceView上面叠加一层图片就好了,用Framelayout布局
就是背景半透明,中间扣掉
第三步:怎么只拍摄框内的图片
这个问题,很多博客都是长篇大论,什么矩阵运算都用上了,虽然很强,但是不想看下去。
拍摄框内的图片,就直接拍完整张照片之后,在照片里面抠图就好了啊。
Bitmap.createBitmap(bitmap,50,250,650,500);
自己算一下透明框大概在什么位置,左上角的坐标是什么,宽和高是什么。用上述函数就可以在原照片抠图了。
第四步:完善一点,加入点击对焦
其实就是在点击事件里面调用对焦函数就行
总的代码:
public class MainActivity extends AppCompatActivity { private SurfaceView surfaceview; private Camera camera; private Button take; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // 没有标题 必须在设置布局之前找到调用 setContentView(R.layout.activity_main); /* getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, // 设置全屏显示 WindowManager.LayoutParams.FLAG_FULLSCREEN); */ take = (Button)findViewById(R.id.take); surfaceview = (SurfaceView) findViewById(R.id.surfaceview); SurfaceHolder holder = surfaceview.getHolder(); holder.setFixedSize(176, 155);// 设置分辨率 holder.setKeepScreenOn(true); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // SurfaceView只有当activity显示到了前台,该控件才会被创建 因此需要监听surfaceview的创建 holder.addCallback(new MySurfaceCallback()); //拍照按钮 take.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takepicture(); } }); } //点击事件 @Override public boolean onTouchEvent(MotionEvent event) { //对焦 camera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean b, Camera camera) { camera.cancelAutoFocus(); } }); return super.onTouchEvent(event); } /** * 监听surfaceview的创建 * @author Administrator * Surfaceview只有当activity显示到前台,该空间才会被创建 */ private final class MySurfaceCallback implements SurfaceHolder.Callback { @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub try { // 当surfaceview创建就去打开相机 camera = Camera.open(); Camera.Parameters params = camera.getParameters(); // Log.i("i", params.flatten()); params.setJpegQuality(80); // 设置照片的质量 params.setPictureSize(1024, 768); params.setPreviewFrameRate(5); // 预览帧率 camera.setParameters(params); // 将参数设置给相机 //右旋90度,将预览调正 camera.setDisplayOrientation(90); // 设置预览显示 camera.setPreviewDisplay(surfaceview.getHolder()); // 开启预览 camera.startPreview(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub if(camera != null){ camera.release(); camera = null; } } } //拍照的函数 public void takepicture(){ /* * shutter:快门被按下 * raw:相机所捕获的原始数据 * jpeg:相机处理的数据 */ camera.takePicture(null, null, new MyPictureCallback()); } //byte转Bitmap public Bitmap Bytes2Bimap(byte[] b) { if (b.length != 0) { return BitmapFactory.decodeByteArray(b, 0, b.length); } else { return null; } } //bitmap转byte public byte[] Bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } //照片回调函数,其实是处理照片的 private final class MyPictureCallback implements Camera.PictureCallback { @Override public void onPictureTaken(byte[] data, Camera camera) { // TODO Auto-generated method stub try { Bitmap bitmap = Bytes2Bimap(data); Matrix m = new Matrix(); int width = bitmap.getWidth(); int height = bitmap.getHeight(); m.setRotate(90); //将照片右旋90度 bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true); Log.d("TAG","width "+width); Log.d("TAG","height "+height); //截取透明框内照片 bitmap = Bitmap.createBitmap(bitmap,50,250,650,500); data = Bitmap2Bytes(bitmap); File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg"); FileOutputStream fos = new FileOutputStream(file); fos.write(data); // 在拍照的时候相机是被占用的,拍照之后需要重新预览 camera.startPreview(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
以上所述是小编给大家介绍的Android开发仿扫一扫实现拍摄框内的照片功能 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
可使用前端相机或背面相机拍摄照片。 A ) (显示模式) 轻触图标可切换为显示模式。 B ) (位置数据)/(切换相机)/(切换图像大小) 启用位置数据的使用设定即可显示(位置数据)。轻触图标可使用Wi-Fi、GPS*、手机基地台*的信息取得位置数据。取得后会显示(已取得位置数据),拍摄照片时会同时记录位置数据。 * 仅限3G/Wi-Fi机种 C ) (快门) 轻触图标可拍摄照片。 D ) 已拍摄
本文向大家介绍Android开发实现模仿360二维码扫描功能实例详解,包括了Android开发实现模仿360二维码扫描功能实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android开发实现模仿360二维码扫描功能的方法。分享给大家供大家参考,具体如下: 一、效果图: 二、框架搭建 1、首先,下载最新zxing开源项目。 下载地址:http://code.google.com/p
本文向大家介绍Android实现拍照截图功能,包括了Android实现拍照截图功能的使用技巧和注意事项,需要的朋友参考一下 本文将向大家展示如何拍照截图。 先看看效果图: 拍照截图有点儿特殊,要知道,现在的Android智能手机的摄像头都是几百万的像素,拍出来的图片都是非常大的。因此,我们不能像对待相册截图一样使用Bitmap小图,无论大图小图都统一使用Uri进行操作。 一、首先准备好需要使用到的
本文向大家介绍Android实现手机拍照功能,包括了Android实现手机拍照功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家讲解如何轻松实现Android手机拍照功能,分享给大家供大家参考。具体如下: 一、布局文件main.xml 二、MainActivity.java 三、添加权限 效果如下: 希望本文所述对大家学习Android软件编程有所帮助。
本文向大家介绍iOS使用视听媒体框架AVFoundation实现照片拍摄,包括了iOS使用视听媒体框架AVFoundation实现照片拍摄的使用技巧和注意事项,需要的朋友参考一下 用系统自带的视听媒体的框架,AVFoundation实现照片拍摄。相比UIKit框架(UIImagePickerController高度封装),AVFoundation框架让开发者有更大的发挥空间。 首先看一下效果图:
本文向大家介绍Android实现拍照、选择图片并裁剪图片功能,包括了Android实现拍照、选择图片并裁剪图片功能的使用技巧和注意事项,需要的朋友参考一下 一、 实现拍照、选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果。 二、 uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修
本文向大家介绍Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能,包括了Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Vue2.0实现调用摄像头进行拍照功能的具体代码,以及图片上传功能引用exif.js,供大家参考,具体内容如下 可以在github 上下载demo链接 vue组件代码 引用的e
问题内容: 我想在我的应用中以真实的黑白照片。我也在该网站上搜索了解决方案,但是我总是找到将照片放成灰度的解决方案(例如在本主题中),但这不是我想要的… 我还发现了一个提出这一建议的主题: 但是图像质量太差了… 请问有人有主意吗? 谢谢 问题答案: 如果您希望图像为1位黑白,则可以使用简单的(慢速)阈值算法 但是,根据看起来不太好的东西,要获得更好的结果,您需要使用抖动算法,请参阅算法概述 -这是