温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android调用系统摄像头拍照并剪裁压缩

发布时间:2020-07-24 00:00:23 来源:网络 阅读:1174 作者:学习的小猪 栏目:移动开发

由于业务需要写了一个Android手机拍照的功能Demo,同时实现了图片剪裁和图片压缩。以下是源码


package com.klp.demo_025; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends Activity {     private ImageView iv;     private Button button;     private File file;     private Uri uri;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         iv = (ImageView) findViewById(R.id.p_w_picpathView1);         button = (Button) findViewById(R.id.button1);         file = new File(this.getExternalFilesDir(null), "p_w_picpath.jpg");         uri = Uri.fromFile(file);         button.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 // TODO Auto-generated method stub                 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                 intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);                 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);                 startActivityForResult(intent, 2);             }         });     }     @Override     protected void onActivityResult(int requestCode, int resultCode, Intent data) {         // TODO Auto-generated method stub         super.onActivityResult(requestCode, resultCode, data);         if (resultCode == RESULT_OK) {             if (requestCode == 2) {                 startPhotoZoom(uri);             } else {                 try {                     BitmapFactory.Options options = new BitmapFactory.Options();                     options.inSampleSize = 2;                     Bitmap bitmap = BitmapFactory.decodeFile(file.getPath(),                             options);                     // 压缩图片 //                    bitmap = compressImage(bitmap,500);                     if (bitmap != null) {                         // 显示图片                         iv.setImageBitmap(bitmap);                         // 保存图片                         FileOutputStream fos = null;                         fos = new FileOutputStream(file);                         bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);                         fos.flush();                         fos.close();                     }                 } catch (Exception e) {                     // TODO: handle exception                 }             }         }     }     /**      * 裁剪图片      *       * @param uri      */     public void startPhotoZoom(Uri uri) {         Intent intent = new Intent("com.android.camera.action.CROP");         intent.setDataAndType(uri, "p_w_picpath/*");         intent.putExtra("crop", "true");// crop=true 有这句才能出来最后的裁剪页面.         intent.putExtra("aspectX", 1);// 这两项为裁剪框的比例.         intent.putExtra("aspectY", 1);// x:y=1:1         intent.putExtra("outputX", 200);//图片输出大小         intent.putExtra("outputY", 200);         intent.putExtra("output", uri);         intent.putExtra("outputFormat", "JPEG");// 返回格式         startActivityForResult(intent, 3);     }     /**      * 将图片p_w_picpath压缩成大小为 size的图片(size表示图片大小,单位是KB)      *       * @param p_w_picpath      *            图片资源      * @param size      *            图片大小      * @return Bitmap      */     private Bitmap compressImage(Bitmap p_w_picpath, int size) {         ByteArrayOutputStream baos = new ByteArrayOutputStream();         // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中         p_w_picpath.compress(Bitmap.CompressFormat.JPEG, 100, baos);         int options = 100;         // 循环判断如果压缩后图片是否大于100kb,大于继续压缩         while (baos.toByteArray().length / 1024 > size) {             // 重置baos即清空baos             baos.reset();             // 每次都减少10             options -= 10;             // 这里压缩options%,把压缩后的数据存放到baos中             p_w_picpath.compress(Bitmap.CompressFormat.JPEG, options, baos);         }         // 把压缩后的数据baos存放到ByteArrayInputStream中         ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());         // 把ByteArrayInputStream数据生成图片         Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);         return bitmap;     } }

下面是布局,很简单

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     tools:context="${relativePackage}.${activityClass}" >     <ImageView         android:id="@+id/p_w_picpathView1"         android:layout_width="200dp"         android:layout_height="200dp"         android:layout_alignParentTop="true"         android:layout_centerHorizontal="true"         android:layout_marginTop="64dp"         android:src="@drawable/ic_launcher" />     <Button         android:id="@+id/button1"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_below="@+id/p_w_picpathView1"         android:layout_centerHorizontal="true"         android:layout_marginTop="32dp"         android:text="拍照" /> </RelativeLayout>

最后注意,一定要在AndroidManifest.xml添加SD卡访问权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI