【后注:】下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数。看前文的第四条。Y的,省的说我传的代码不能用 

最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在前文(

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

)----http://blog.csdn.net/yanzi1225627/article/details/7934710已经实现。最近发现上层绘制矩形框,用surfaceview有点大材小用了。SurfaceView绘制动画更合适,只绘制个矩形框用ImageView足够了。但有些时候必须要用SurfaceView来实现。比如360手机安全卫士扫描二维码的实现应该就是通过上下两层SurfaceView实现的(见下图)。上层SurfaceView用于显示那个可以旋转的扫描示意框,底层SurfaceView预览摄像头视频。

废话不说了,稍候几天我会仿照上面360这个扫描二维码的界面做一个工程(结合PreviewCallback),公开出来。这次先谈用底层surfaceView+上层ImageView实现只拍摄矩形框中的图像。新建一个类继承ImageView,源码如下:

package yan.guoqi.rectphoto;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Rect;import android.util.AttributeSet;import android.widget.ImageView;public class DrawImageView extends ImageView{ public DrawImageView(Context context, AttributeSet attrs) {  super(context, attrs);  // TODO Auto-generated constructor stub }  Paint paint = new Paint(); {  paint.setAntiAlias(true);  paint.setColor(Color.RED);  paint.setStyle(Style.STROKE);  paint.setStrokeWidth(2.5f);//设置线宽  paint.setAlpha(100); };  @Override protected void onDraw(Canvas canvas) {  // TODO Auto-generated method stub  super.onDraw(canvas);  canvas.drawRect(new Rect(100, 200, 400, 500), paint);//绘制矩形   }   }

布局文件里与前文http://blog.csdn.net/yanzi1225627/article/details/8577756这里一样,只是在帧布局里加一个上面自定义的DrawImageView,整个布局文件示下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/BestWish"        tools:context=".RectPhoto" />    <FrameLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content" >        <SurfaceView            android:id="@+id/previewSV"            android:layout_width="fill_parent"            android:layout_height="800px" />                <yan.guoqi.rectphoto.DrawImageView             android:id="@+id/drawIV"             android:layout_width="fill_parent"             android:layout_height="800px"            />    </FrameLayout>    <ImageButton        android:id="@+id/photoImgBtn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/photo_img_btn"        android:layout_gravity="center" /></LinearLayout>

在主程序文件里,onCreate()函数里设置底层SurfaceView为底层且透明(如果不设也可以,默认就是如此):

mPreviewSV.setZOrderOnTop(false);

mySurfaceHolder.setFormat(PixelFormat.TRANSPARENT);//translucent半透明 transparent透明

在主UI线程里的onCreate()函数里添加代码:

//绘制矩形的ImageView
        mDrawIV = (yan.guoqi.rectphoto.DrawImageView)findViewById(R.id.drawIV);
        mDrawIV.onDraw(new Canvas());

看上面的DrawImageView的函数里的onDraw,画的矩形是Rect(100, 200, 400, 500)。在onPictureTaken(byte[] data, Camera camera)函数里,先将图片旋转90度,大小成为宽×高(960×1280)。由于预览surfaceview的大小是宽×高(540×800),所以在onPictureTaken函数里将960×1280的图片缩放到540×800, 缩放相同大小后就可以用矩阵的坐标直接截取子图了。核心函数就是这两句:

//将960×1280缩放到540×800
            Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, 540, 800, true);
            Bitmap rectBitmap = Bitmap.createBitmap(sizeBitmap, 100, 200, 300, 300);//截取

注意这个截取的函数参数和矩阵的坐标关系,分别是x轴 y轴起始坐标及 x轴宽度 y轴宽度。截取出来的图片大小应该是300×300. onPictureTaken()函数的源码如下:

public void onPictureTaken(byte[] data, Camera camera) {   // TODO Auto-generated method stub   Log.i(tag, "myJpegCallback:onPictureTaken...");   if(null != data){    mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字节数据,将其解析成位图    myCamera.stopPreview();    isPreview = false;   }   //设置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set("rotation", 90)失效。图片竟然不能旋转了,故这里要旋转下   Matrix matrix = new Matrix();   matrix.postRotate((float)90.0);   Bitmap rotaBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, false);      //旋转后rotaBitmap是960×1280.预览surfaview的大小是540×800   //将960×1280缩放到540×800   Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, 540, 800, true);   Bitmap rectBitmap = Bitmap.createBitmap(sizeBitmap, 100, 200, 300, 300);//截取         //保存图片到sdcard   if(null != rectBitmap)   {    saveJpeg(rectBitmap);   }   //再次进入预览   myCamera.startPreview();   isPreview = true;  } 

涉及到的其他函数如saveJpeg()参见前文:

2013新春奉送:Android摄像头开发完美demo---(循环聚焦,缩放大小,旋转picture,查询支持的picturesize, ImageButton按键效果)------------

http://blog.csdn.net/yanzi1225627/article/details/8577756   重复的东西我就不发了。

效果图如下所示:

点击拍照,查看保存后的图片如下:

反思:

1,SurfaceView为啥 无论translucent半透明还是 transparent透明基本没啥区别?而且surfaceview的setAlpha函数不能用。

2,在这里surfaceview一定要在底层(默认如此),如果设成顶层会看不到红色矩形框。可以自己测试下。

3,最纠结的一点,第一副图片里的360扫描二维码的界面,底层的预览surfaceview是半透明的,底色是灰色的,只有中间的扫描矩形框是透明的,亮色。这一块究竟是怎么实现的??下午实验了n种方法愣是无济于事。我擦。。。如果有高人,希望能不吝指点下。 不过说实话,人家已经设计出来的产品界面看着就是好,不得不服阿。以后要多多模仿钻研这些成型产品的设计。

源码下载:http://download.csdn.net/detail/yanzi1225627/5063105

欢迎android爱好者加群248217350,备注:yanzi

----------------------------------------本文系原创,转载请注明作者:yanzi1225627

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

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

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

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

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

    [后注:]下载代码的注意,我的手机是4.3寸的屏,华为U9200.如果不能运行的请修改参数.看前文的第四条.Y的,省的说我传的代码不能用  最近一直在审视以前做过的东西,关于android摄像头预览, ...

  3. android自定义camera预览区域,android camera摄像surfaceview预览界面特定区域(该区域可移动)...

    1.自定义一个imageview用来设定surfaceview上的特定区域. public class DrawImageView extends ImageView { private Paint ...

  4. android 摄像头比例,Android摄像头是全屏预览最简单的方式.doc

    Android摄像头是全屏预览最简单的方式 Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏, ...

  5. Android OpenCV使用4_双目摄像头双开两个预览界面,并获取当前帧图片

    本篇博客其实跟OpenCV也没什么多大关系,因为是同一个项目,博客就顺溜着写了. 在自研设备开发过程中,在项目研发过程中碰到了双目摄像头双开(一个普通摄像头,一个红外摄像头)并获取当前帧的这么一个需求 ...

  6. android 使用 surfaceView 获取 camera 预览界面图像数据

    在android中,通过相机获取预览界面的需求似乎很变态,好像也没有什么使用场景.但是,有一个场景需要获取预览界面的图像,就是扫码,比如微信,支付宝的扫一扫,就是需要获取预览界面的图像数据的. 实现逻 ...

  7. 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

    杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级.后来随着我自己的使用,越来越发现不出个升级版的demo是不行了.有时候就连我自己用这个demo测一些性能. ...

  8. Android通过屏幕方向和摄像头方向实现屏幕预览

    Android通过屏幕方向和摄像头方向实现屏幕预览 1. 前言 2. Android 的屏幕方向 2.1 什么是屏幕方向 2.2 为什么要获取或设置屏幕方向 2.3 如何获取与设置屏幕方向 2.3.1 ...

  9. birt预览能有内容发布后没内容_谷歌突然推出Android 11开发者预览版 新版带来部分新功能和改进...

    谷歌刚刚在安卓开发者网站放出 Android 11 版的开发者预览版,该版本主要面向开发者提供用来测试新版功能. 在新版本里目前谷歌已经发布部分新功能和改进,随着开发者版本不断更迭后续更多新功能和改进 ...

最新文章

  1. pythonweb编程免费教程_python – Web编程教程
  2. 硬盘和显卡的访问与控制(三)(含多彩的Hello)——《x86汇编语言:从实模式到保护模式》读书笔记03
  3. JNI开发笔记(五)--JNI语法总结
  4. 零售业有效利用物联网的几种方法
  5. 计算机快速切换任务,电脑多任务窗口切换:除了Alt+Tab,你还知道什么?
  6. AO如何获取SDE数据库中的数据
  7. 如何使用 python 爬取全国小区名称
  8. QT5.9.9安装教程
  9. 简单、快捷、低成本的超写实虚拟人平台来了……
  10. 计算机怎么改鼠标标志,电脑鼠标指针怎么改 修改电脑鼠标指针方法【图文】...
  11. vs2003 常见问题及处理
  12. 计算机中的颗粒度(granularity)什么是颗粒度?
  13. 计算机网线接口灯怎样是正常,电脑网线接口灯不亮是什么原因
  14. 中英文敏感词过滤API推荐
  15. android电话、短信黑白名单拦截、电话录音
  16. Linux学习(五):挂载新的硬盘
  17. 智捷教育关东升老师Java视频
  18. DJI AirWorks|赛尔无人机携手大疆航测生态布局全球市场
  19. 方方格子access_工具|史上最全Excel插件集合及相关安装包!
  20. 2019年全国职业院校技能大赛—大数据技术与应用

热门文章

  1. 需求来源以及竞品分析
  2. java 金额计算_java中金额计算
  3. 程序安装报错0x80070660的解决
  4. 消息中间件ActiveMQ 4: 传输协议
  5. 孙宇晨也许会迟到,但永远不会缺席!
  6. ssi 指令 php,SSI 漏洞学习笔记
  7. 网管型工业交换机冗余功能介绍
  8. 3ds max - 导出 fbx 后,再导入 到 unity 材质会分开的问题如何解决
  9. QuickBooks Online For Dummies, 4th Edition 免积分下载
  10. 谈一谈Flutter中的共享元素动画Hero