仿扫一扫实现拍摄框内的照片

来源:互联网 发布:卫星地图下载软件 编辑:程序博客网 时间:2024/04/30 06:55

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

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

先上效果图:

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

这是所有步骤的前提,没有预览,用户怎么知道自己拍的什么呢。预览用的是SurfaceView

http://www.cnblogs.com/androidez/archive/2013/02/04/2892439.html

这篇博文写得已经十分详细了,打开照相机,然后拍照,而且十分简洁!不想别的博客一下就几百行代码不知所云。这篇代码可以复制下去当相机模版使用。

这里遇到一个问题,就是预览的效果是左转90度的,拍出来也是左转90度的,查了很多资料,大家统一的做法就是。在相机预览那里设置右旋90度,拍下的照片再右旋90度,具体的做法我会贴代码

第二步:设置半透明边框

很多博客的做法是绘图呀什么的,太过负责。

其实如果考虑简单点的话,只要在surfaceView上面叠加一层图片就好了,用Framelayout布局

就是背景半透明,中间扣掉

第三步:怎么只拍摄框内的图片

这个问题,很多博客都是长篇大论,什么矩阵运算都用上了,虽然很强,但是不想看下去。

拍摄框内的图片,就直接拍完整张照片之后,在照片里面抠图就好了啊。

1
Bitmap.createBitmap(bitmap,50,250,650,500);

自己算一下透明框大概在什么位置,左上角的坐标是什么,宽和高是什么。用上述函数就可以在原照片抠图了。

第四步:完善一点,加入点击对焦

其实就是在点击事件里面调用对焦函数就行

总的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
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(176155);// 设置分辨率
            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(1024768);
                    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(nullnullnew 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, 00, 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();
                }
 
            }
 
        }
 
}

  

http://www.cnblogs.com/wzben/p/5888035.html