Android开发仿扫一扫实现拍摄框内的照片功能

Android开发仿扫一扫实现拍摄框内的照片功能,第1张

概述就是仿照现在扫一扫的形式,周围是半透明的遮挡,然后中间是全透明的,拍摄后只截取框内的内容

就是仿照现在扫一扫的形式,周围是半透明的遮挡,然后中间是全透明的,拍摄后只截取框内的内容

查了很多博客,实现起来真的太复杂了,本人比较怕麻烦所以在很多地方偷懒了

先上效果图:

第一步:设置照相机预览以及拍照

这是所有步骤的前提,没有预览,用户怎么知道自己拍的什么呢。预览用的是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;@OverrIDeprotected 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() {@OverrIDepublic voID onClick(VIEw vIEw) {takepicture();}});}//点击事件@OverrIDepublic boolean ontouchEvent(MotionEvent event) {//对焦camera.autoFocus(new Camera.autoFocusCallback() {@OverrIDepublic voID onautoFocus(boolean b,Camera camera) {camera.cancelautoFocus();}});return super.ontouchEvent(event);}/*** 监听surfacevIEw的创建* @author administrator* SurfacevIEw只有当activity显示到前台,该空间才会被创建*/private final class MySurfaceCallback implements SurfaceHolder.Callback {@OverrIDepublic voID surfaceChanged(SurfaceHolder holder,int format,int wIDth,int height) {// Todo auto-generated method stub}@OverrIDepublic voID surfaceCreated(SurfaceHolder holder) {// Todo auto-generated method stubtry {// 当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 blocke.printstacktrace();}}@OverrIDepublic voID surfaceDestroyed(SurfaceHolder holder) {// Todo auto-generated method stubif(camera != null){camera.release();camera = null;}}}//拍照的函数public voID takepicture(){/** shutter:快门被按下* raw:相机所捕获的原始数据* jpeg:相机处理的数据*/camera.takePicture(null,null,new MyPictureCallback());}//byte转Bitmappublic Bitmap Bytes2Bimap(byte[] b) {if (b.length != 0) {return BitmapFactory.decodeByteArray(b,b.length);} else {return null;}}//bitmap转bytepublic 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 {@OverrIDepublic voID onPictureTaken(byte[] data,Camera camera) {// Todo auto-generated method stubtry {Bitmap bitmap = Bytes2Bimap(data);Matrix m = new Matrix(); int wIDth = bitmap.getWIDth(); int height = bitmap.getHeight(); m.setRotate(90);//将照片右旋90度bitmap = Bitmap.createBitmap(bitmap,wIDth,height,m,true);Log.d("TAG","wIDth "+wIDth);Log.d("TAG","height "+height);//截取透明框内照片bitmap = Bitmap.createBitmap(bitmap,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 blocke.printstacktrace();}}}} 

以上所述是小编给大家介绍的AndroID开发仿扫一扫实现拍摄框内的照片功能 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

总结

以上是内存溢出为你收集整理的Android开发仿扫一扫实现拍摄框内的照片功能全部内容,希望文章能够帮你解决Android开发仿扫一扫实现拍摄框内的照片功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1148119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存