由于业务需要写了一个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;    }}

下面是布局,很简单

        

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

更多相关文章

  1. 使用android访问SQLServer数据库
  2. [Android]Android数据的四种存储方式
  3. Android系统自带的常用数据库
  4. android 拖动图片/拖动浮动按钮
  5. Android数据的四种存储方式
  6. android中的按钮以图片的方式显示_基础篇
  7. Android旋转屏幕不销毁数据的方法
  8. Android使用SQLiteDatabase直接存取数据与图像
  9. android 数据库操作 GreenDAO 第三方开源项目

随机推荐

  1. 安装本机 sdcard
  2. Android 控件背景图片和imagebutton的使
  3. android极简原创系列:tabhost最简单配置
  4. myeclipse8.5+win7 配置android 开发环境
  5. Android Studio介绍
  6. Android沉浸式状态栏以及浅色模式开发
  7. Failed to install ***.apk on device 解
  8. Android 圆角外边框
  9. android之Androidstudio下查找sha1
  10. Android分层