Android只拍摄SurfaceView预览界面特定区域内容完整实现介绍及源

时间:2016-08-22 10:35 来源:互联网 作者:源码搜藏收藏

  • 源码类别:SurfaceView
  • 源码大小:727 KB
  • 编码格式:gbk,utf8,不限
  • 运行环境:php+mysql
  • 广告推荐

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

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

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

 

[java] view plain copy
 
 print?
  1. package yan.guoqi.rectphoto;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Paint.Style;  
  8. import android.graphics.Rect;  
  9. import android.util.AttributeSet;  
  10. import android.widget.ImageView;  
  11.   
  12. public class DrawImageView extends ImageView{  
  13.   
  14.     public DrawImageView(Context context, AttributeSet attrs) {  
  15.         super(context, attrs);  
  16.         // TODO Auto-generated constructor stub  
  17.     }  
  18.       
  19.     Paint paint = new Paint();  
  20.     {  
  21.         paint.setAntiAlias(true);  
  22.         paint.setColor(Color.RED);  
  23.         paint.setStyle(Style.STROKE);  
  24.         paint.setStrokeWidth(2.5f);//设置线宽  
  25.         paint.setAlpha(100);  
  26.     };  
  27.       
  28.     @Override  
  29.     protected void onDraw(Canvas canvas) {  
  30.         // TODO Auto-generated method stub  
  31.         super.onDraw(canvas);  
  32.         canvas.drawRect(new Rect(100200400500), paint);//绘制矩形  
  33.           
  34.     }  
  35.       
  36.       
  37.   
  38.   
  39.       
  40.   
  41. }  

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

 

 

[html] view plain copy
 
 print?
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="@string/BestWish"  
  11.         tools:context=".RectPhoto" />  
  12.   
  13.     <FrameLayout  
  14.         android:layout_width="wrap_content"  
  15.         android:layout_height="wrap_content" >  
  16.   
  17.         <SurfaceView  
  18.             android:id="@+id/previewSV"  
  19.             android:layout_width="fill_parent"  
  20.             android:layout_height="800px" />  
  21.           
  22.         <yan.guoqi.rectphoto.DrawImageView  
  23.              android:id="@+id/drawIV"  
  24.              android:layout_width="fill_parent"  
  25.              android:layout_height="800px"  
  26.             />  
  27.     </FrameLayout>  
  28.   
  29.     <ImageButton  
  30.         android:id="@+id/photoImgBtn"  
  31.         android:layout_width="wrap_content"  
  32.         android:layout_height="wrap_content"  
  33.         android:background="@drawable/photo_img_btn"  
  34.         android:layout_gravity="center" />  
  35.   
  36. </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()函数的源码如下:

本站资源仅限于学习研究,严禁从事商业或者非法活动! 源码搜藏网所有源码来自互联网转载与用户上传分享,如果侵犯了您的权益请与我们联系,我们将在24小时内删除!谢谢!

SurfaceView下载排行

最新文章