android开发之Camera(相机)

今天学习了android开发中的相机的开发,总结了关于android中相机的开发流程:

*使用surfaceview进行预览

*需要开启的权限
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

1.布局文件:

<SurfaceView
 android:id="@+id/svPreview"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

2.为surfaceview设置callback
mSfPreview.getHolder().addCallback(new SfCallback());

public class SfCallback implements SurfaceHolder.Callback{

   /**
     * 设置相机属性
     */
void setCamera(){

Camera.Parameters parameters = mCamera.getParameters();
//得到相机支持的拍照分辨率,按大小排列(有的手机从大到小,有的从小到大)
List<Camera.Size> listSize = parameters .getSupportedPictureSizes();
// 从大到小排列的情况下,设置照片的大小,只能设置成支持的size,不能随意设置
//不同的机型,listSize中的值的顺序不同,需要查看本机在哪个值的时候最清晰
parameters.setPictureSize(listSize.get(0).width,listSize.get(0).height);

// 设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG);

//默认情况下相机是横向的,这里只是改变预览的方向
 mCamera.setDisplayOrientation(90);
 //将参数设置到Camera对象中
 mCamera.setParameters(parameters);
}

     /**
         * 创建的时候调用
         * @param holder
         */
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();//打开相机
        try {

            setCamera();
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();

} catch (IOException e) {
            e.printStackTrace();
}

    }
       /**
         * 状态改变的时候调用
         * @param holder
         * @param format
         * @param width
         * @param height
         */
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//自动对焦
mCamera.autoFocus(null);
}
    /**
         * 销毁的时候调用
         * @param holder
         */
@Override
public void surfaceDestroyed(SurfaceHolder holder) {

    //释放camera
    if(mCamera != null){
    mCamera.release();
    mCamera = null;
    }
    }    
}



3.拍照开始


@OnClick(R.id.btBegin)
public void capturePhoto(View view) {

/*第一个参数按下快门时回调,
 *第二个参数处理原始的照片数据,
 *第三个参数处理jpeg格式照片,一般用于存放照片
 */
mCamera.takePicture(null, null, new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
            Bitmap bmSrc = BitmapFactory.decodeByteArray(data,
        0,data.length);
        Bitmap bmRotate = RotateBitmap(bmSrc);//旋转
        saveBitmap(bmRotate);//保存

        //重新开启预览
        mCamera.startPreview();
    }

    });
}

3.1.旋转图片

/**
 * 旋转照片
 *
 * @param bmSrc
*/
public Bitmap RotateBitmap(Bitmap bmSrc) {
    Bitmap bmRotate = null;

    Matrix matrix = new Matrix();
    matrix.setRotate(90);//顺时针旋转90度
    bmRotate = Bitmap.createBitmap(bmSrc, 0, 0,
    bmSrc.getWidth(), bmSrc.getHeight(),matrix, true);

    bmSrc.recycle();
        return bmRotate;
}

3.2.保存照片
/**
 * 保存图片
 * @param bmToSave
 */
public void saveBitmap(Bitmap bmToSave) {
    //以时间为文件名
    SimpleDateFormat simpleDateFormat =
    new SimpleDateFormat("yyyyMMddhhmmss");
    String time = simpleDateFormat.format(new Date());
    File file = new File("/sdcard/" + time + ".jpg");

    BufferedOutputStream bufferedOutputStream = null;
        try {
        bufferedOutputStream = new BufferedOutputStream(new     FileOutputStream(file));
    bmToSave.compress(Bitmap.CompressFormat.JPEG,
    100,bufferedOutputStream);//将图片压缩到流中

    bufferedOutputStream.flush();//输出缓冲区的内容到本地
    bufferedOutputStream.close();//关闭
    } catch (Exception e) {
        e.printStackTrace();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值