📌  相关文章
📜  拍照的代码 (1)

📅  最后修改于: 2023-12-03 14:54:37.894000             🧑  作者: Mango

拍照的代码

拍照是现代智能手机普遍具备的重要功能之一。使用代码实现拍照功能需要涉及到硬件调用和图片处理等步骤。

硬件调用

在 Android 平台中,需要使用 Camera API 来实现拍照功能。具体的实现步骤如下:

  1. 获取 Camera 实例。
private Camera mCamera;
mCamera = getCameraInstance();
  1. 打开相机预览界面。
private SurfaceHolder mHolder;
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    //停止预览
    mCamera.stopPreview();
    //重新设置预览大小
    Camera.Parameters parameters = mCamera.getParameters();
    Camera.Size size = getOptimalPreviewSize(parameters.getSupportedPreviewSizes(), width, height);
    parameters.setPreviewSize(size.width, size.height);
    mCamera.setParameters(parameters);
    //开始预览
    mCamera.startPreview();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    //停止预览
    mCamera.stopPreview();
    //释放相机资源
    mHolder.removeCallback(this);
    mCamera.release();
    mCamera = null;
}

其中,getCameraInstance() 方法用于获取 Camera 实例,mCamera.setPreviewDisplay(holder) 方法用于将预览界面输出到 SurfaceView 上。

  1. 拍照。
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        //将图片转换为 Bitmap 对象
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        //保存图片
        savePicture(bitmap);
        //重新开始预览
        mCamera.startPreview();
    }
};

public void takePicture() {
    mCamera.takePicture(null, null, mPictureCallback);
}

其中,mPictureCallback 用于处理拍照后的数据。takePicture() 方法用于触发拍照动作。

图片处理

在拍照完成后,需要对图片进行处理。例如,可以将图片保存到本地或者上传到服务器等。具体的实现步骤如下:

  1. 将图片转化为 Bitmap 对象。
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
  1. 保存图片。
public void savePicture(Bitmap bitmap) {
    //创建文件夹
    File dir = new File(Environment.getExternalStorageDirectory(), "Pictures");
    if (!dir.exists()) {
        dir.mkdir();
    }
    //创建文件
    String fileName = System.currentTimeMillis() + ".jpg";
    File file = new File(dir, fileName);
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        Toast.makeText(this, "保存成功!路径:" + file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "保存失败!" + e.getMessage(), Toast.LENGTH_SHORT).show();
    } finally {
        try {
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

其中,Environment.getExternalStorageDirectory() 方法用于获取外部存储路径,dir.mkdir() 方法用于创建文件夹,file.getAbsolutePath() 方法用于获取文件保存路径。

以上就是拍照的代码实现步骤。