您的位置:首页 > 移动开发 > Android开发

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

2015-07-17 15:07 489 查看
由于业务需要写了一个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.imageView1);

button = (Button) findViewById(R.id.button1);



file = new File(this.getExternalFilesDir(null), "image.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, "image/*");

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);

}



/**

* 将图片image压缩成大小为 size的图片(size表示图片大小,单位是KB)

*

* @param image

* 图片资源

* @param size

* 图片大小

* @return Bitmap

*/

private Bitmap compressImage(Bitmap image, int size) {



ByteArrayOutputStream baos = new ByteArrayOutputStream();

// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

image.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中

image.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/imageView1"

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/imageView1"

android:layout_centerHorizontal="true"

android:layout_marginTop="32dp"

android:text="拍照" />



</RelativeLayout>

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

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

原文地址:http://www.linuxidc.com/Linux/2014-12/110924.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: