美文网首页
android系统拍照完整流程

android系统拍照完整流程

作者: Android技术研究 | 来源:发表于2016-02-26 14:37 被阅读533次

    1、拍照相片存储的临时文件

    File savePath=new File(Environment.getExternalStorageDirectory(),"/temp/temp.jpg");

    2、开启系统相机

    Intent cameraIntent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    Uri imageUri = Uri.fromFile(savePath);

    // 指定照片保存路径(SD卡),temp.jpg为一个临时文件,每次拍照后这个图片都会被替换

    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

    startActivityForResult(cameraIntent, Constant.PHOTO_GRAPH);

    3、当拍照完毕后系统会调用onActivityResult

    @Override

    public void onActivityResult(int requestCode,int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    switch(requestCode) {

    case Constant.PHOTO_GRAPH:

    if(RESULT_CANCELED!= resultCode) {

    //根据savePath.getAbsolutePath()绝对路径获取当前拍摄的图片去做相关逻辑操作

    //保存图片到系统内容提供器

    url[0] = MediaStore.Images.Media.insertImage(appContext.getContentResolver(),

    picPath,null,null);

    }

    }

    break;

    4、创建本地图片存放路径

    private String createPicPath(String path) {

    File dirFile =new File(Environment.getExternalStorageDirectory().getPath()

    + path);

    if(!dirFile.exists()) {

    dirFile.mkdirs();

    }

    // 格式化时间

    String dataTake =new SimpleDateFormat(

    "yyyyMMddHHmmssSSS").format(newDate());

    return dirFile.getPath() + File.separator+ dataTake +".jpg";

    }

    4、保存本地图片

    public boolean saveImage(String path, String spath) {

    BufferedOutputStream bos =null;

    try{

    bos =new BufferedOutputStream(

    new FileOutputStream(spath,false));

    Bitmap photo = getBitmap(path);

    photo.compress(Bitmap.CompressFormat.JPEG,80, bos);

    bos.flush();

    }catch(Exception e) {

    e.printStackTrace();

    return false;

    }finally{

    try{

    if(bos !=null)

    bos.close();

    }catch(IOException e) {

    e.printStackTrace();

    return false;

    }

    }

    return true;

    }

    5、缩放图片,压缩质量

    public boolean saveImage(String path, String spath) {

    BufferedOutputStream bos =null;

    try{

    bos =new BufferedOutputStream(

    newFileOutputStream(spath,false));

    Bitmap photo = getBitmap(path);

    photo.compress(Bitmap.CompressFormat.JPEG,80, bos);

    bos.flush();

    }catch(Exception e) {

    e.printStackTrace();

    return false;

    }finally{

    try{

    if(bos !=null)

    bos.close();

    }catch(IOException e) {

    e.printStackTrace();

    return false;

    }

    }

    return true;

    }

    6、压缩比例

    public Bitmap getBitmap(String filePath) {

    final BitmapFactory.Options options =newBitmapFactory.Options();

    options.inJustDecodeBounds=true;

    BitmapFactory.decodeFile(filePath, options);

    options.inSampleSize=calculateInSampleSize1(options,480,800);

    options.inJustDecodeBounds=false;

    Bitmap bitmap = toRotationBitmap(BitmapFactory.decodeFile(filePath, options), getExifOrientation(filePath));

    returnbitmap;

    }

    7、旋转图片

    private Bitmap toRotationBitmap(Bitmap bitmap,final introtation) {

    if(rotation ==0)

    return bitmap;

    Matrix matrix =new Matrix();

    matrix.postRotate(rotation);

    int height = bitmap.getHeight();

    int width = bitmap.getWidth();

    float scale =1f;

    // 防止内存溢出,先添加一个基本判断,根据测试情况更改

    while(height >2200) {

    height /=2;

    width /=2;

    scale *=0.5f;

    }

    matrix.postScale(scale, scale);

    int neHeight = height;

    int neWidth = width;

    if(rotation ==90|| rotation ==270) {

    neHeight = width;

    neWidth = height;

    }

    Bitmap canvasBitmap = Bitmap.createBitmap(neWidth, neHeight,

    Bitmap.Config.ARGB_8888);

    Canvas canvas =newCanvas(canvasBitmap);

    float transX = height;

    float transY =0;

    if(rotation ==90) {

    transX = height;

    transY =0;

    }else if(rotation ==180) {

    transX = width;

    transY = height;

    }else if(rotation ==270) {

    transX =0;

    transY = width;

    }else{

    transX =0;

    transY =0;

    }

    matrix.postTranslate(transX, transY);

    canvas.drawBitmap(bitmap, matrix,newPaint());

    if(bitmap !=null) {

    bitmap.recycle();

    bitmap =null;

    System.gc();

    }

    return canvasBitmap;

    }

    8、获取拍摄角度

    public int getExifOrientation(String path) {

    String img_path = path;

    System.out.println("图片位置"+ img_path);

    int degree =0;

    ExifInterface exif =null;

    try{

    exif =new ExifInterface(img_path);

    }catch(IOException e) {

    e.printStackTrace();

    }

    if(exif !=null) {

    intorientation = exif.getAttributeInt(

    ExifInterface.TAG_ORIENTATION, -1);

    if(orientation != -1) {

    // We only recognize a subset of orientation tag values.

    switch(orientation) {

    case ExifInterface.ORIENTATION_ROTATE_90:

    degree =90;

    break;

    case ExifInterface.ORIENTATION_ROTATE_180:

    degree =180;

    break;

    case ExifInterface.ORIENTATION_ROTATE_270:

    degree =270;

    break;

    }

    }

    }

    return degree;

    }

    基本处理操作就这么多,仅供参考。

    相关文章

      网友评论

          本文标题:android系统拍照完整流程

          本文链接:https://www.haomeiwen.com/subject/lpkwkttx.html