android裁剪图片功能,实战:七步教你Android图片拍摄及剪裁

【IT168技术】现在,很多Android设备都有内置的摄象头了,在本教程中,我们将学习如何在程序中调用Android手机中的摄象头进行图像的摄制,并且如何在拍摄照片后,如何利用用户已经安装在设备中的软件进行图片的剪裁,此外,本文还会展示对于用户的手机设备如果不支持图片捕捉和剪裁的话,应该如何去做.本文适合有一定Android 开发基础的用户阅读。

步骤1、创建新的Android工程

使用Eclipse创建一个新的工程,并且在主界面的实现类中,首先导入如下的包:

import android.app.Activity;

import android.content.ActivityNotFoundException;

import android.content.Intent;

import android.graphics.Bitmap;

import android.net.Uri;

import android.os.Bundle;

import android.provider.MediaStore;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.Toast;

然后,在res/values目录中应用的定义字符串的文件strings.xml中,增加如下的定义:

Capture a picturetocrop!PictureLaunch Camera

我们将在接下来的界面中应用这些定义好的字符串资源。

步骤2、设计应用的界面

首先,打开main.xml的主界面,我们使用Linearlayout布局格式,如下代码:

并且在布局文件中添加一个文本标签,如下:

android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/intro"android:layout_margin="3dp"android:textStyle="bold"/>

接着再加一个button按钮和一个image控件,代码如下:

android:id="@+id/capture_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/capture"/>

android:id="@+id/picture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@string/picture"android:layout_margin="5dp"android:background="@drawable/pic_border"/>

在这里,我们将通过手机捕捉的图片放在imageview控件中,并且设置了该imageview控件的文字提示内容,并且设置了背景颜色为drawable目录中指定的pic_border样式定义的颜色.其中pic_border.xml如下:

<?xml version="1.0"encoding="utf-8"?>

android:startColor="#99ffffff"android:endColor="#99ffffff"android:centerColor="#00000000"android:angle="90"/>

android:width="2dp"android:color="#ccffffff"/>

如果希望图片控件大小占满整个屏幕,则可以使用fill_parent属性而不是wrap_content,但这样要注意会减低图片的质量。这时我们运行下应用,可以看到现在的界面效果是如下图所示:

a17012246510a52355d2c9d6e8919494.png${PageNumber}

步骤3 用户点击事件的编写

接下来,我们针对按钮编写响应用户点击的事件,代码如下:

publicclass ShootAndCropActivity extends Activity implements OnClickListener {

Button captureBtn=(Button)findViewById(R.id.capture_btn);

captureBtn.setOnClickListener(this);publicvoid onClick(View v) {if(v.getId()==R.id.capture_btn) {

}

}

在上面的代码框架中,在if语句块中则写入对移动设备摄象头的调用代码,请继续看下一步

步骤4 启动摄象头

首先,我们声明如下的一些实例变量:

//该变量跟踪捕捉图像的intent

finalintCAMERA_CAPTURE=1;//摄影图片后的uriprivateUri picUri;

我们首先使用了一个变量来跟踪用户对使用摄象头的交互动作,因为用户总是调用摄象头后会返回,这里是跟踪其intent。第二个变量则是保存摄影图片后的uri,接着在上面的if判断语句块中,写入如下代码:

try {//使用标准的intent去进行视频捕捉

Intent captureIntent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);//在onActivityForResult事件中进行相关的处理回调

startActivityForResult(captureIntent, CAMERA_CAPTURE);

}

当执行上面的代码时,会首先调用移动设备上的摄象头进行拍摄,并且会在OnActivityResult事件中对返回的图片的结果进行回调处理,这是通过之前定义的实例变量CAMERA_CAPTURE去判断用户是否正确从拍摄完视频后返回,记得要注意的时,我们还要判断用户的设备是否支持摄象头的拍摄功能,因为虽然目前大多数Android手机都有摄象头,但不能排除特殊情况,因此加入如下的异常捕捉代码:

catch(ActivityNotFoundException anfe){StringerrorMessage="Whoops - your device doesn't support capturing images!";

Toast toast=Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);

toast.show();

}

下图是通过设备摄象头拍摄的照片,如下:

54bf929396b8036f467a208768e5d3fb.png

${PageNumber}

步骤5 获得捕捉的图象

接下来,我们在onActivityResult事件中,获得返回的图像,先编写代码框架如下:

protected void onActivityResult(intrequestCode,intresultCode, Intent data) {if(resultCode==RESULT_OK) {

}

}

然后在if语句块中,检查是否是从摄象头应用的app返回,并且同时返回获得图像,如下代码:

if(requestCode==CAMERA_CAPTURE){

picUri=data.getData();//剪裁图片的方法

performCrop();

}

接下来,我们要编写针对图片的剪裁方法。

步骤6 图片剪裁方法

首先我们依然要写出异常的处理框架,以防止用户的设备不支持图片的剪裁,代码如下:

try {

}

catch(ActivityNotFoundException anfe){//display anerrormessageStringerrorMessage="Whoops - your device doesn't support the crop action!";

Toast toast=Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);

toast.show();

}

接下来,在try内写真正的剪裁剪代码的部分,代码如下:

Intent cropIntent=newIntent("com.android.camera.action.CROP");//图片来源

cropIntent.setDataAndType(picUri,"image/*");//设置剪裁剪属性

cropIntent.putExtra("crop","true");

cropIntent.putExtra("aspectX",1);

cropIntent.putExtra("aspectY",1);//输出的坐标

cropIntent.putExtra("outputX",256);

cropIntent.putExtra("outputY",256);//返回剪裁的图片数据

cropIntent.putExtra("return-data",true);

startActivityForResult(cropIntent, PIC_CROP);

在上面的代码中,通过调用Android的剪裁图片的intent进行图片的剪裁功能,并设置了一系列的剪裁属性。跟之前一样,为了能跟踪用户剪裁图片完毕,必须设置一个实例变量

final int PIC_CROP = 2;

这个变量稍候也要在onActivityForResult响应事件中用到。

下图是拍摄图片后剪裁图片时的情况:

3e1db1781b50849511b85587b0212b63.png

用户可以自由拖动剪裁的区域,如下图:

b4d2ca7c5a13f3368e915818359fe664.png

步骤7 显示剪裁区域的图片

最后我们要将剪裁的图片重新在我们应用中的界面中显示出来。首先,我们在onActivityResult方法中,在之前的判断是否从拍摄照片后的intent返回的if语句块后,增加如下的else判断语句,判断用户是否已经剪裁完毕:

elseif(requestCode==PIC_CROP){//获得返回的数据

Bundle extras=data.getExtras();//获得实际剪裁的区域的bitmap图形

Bitmap thePic=extras.getParcelable("data");//获得imageview控件的引用

ImageView picView=(ImageView)findViewById(R.id.picture);//在imageview控件中显示图片

picView.setImageBitmap(thePic);

}

最后,我们运行编写好的应用运行一下,如下图的界面,当点击Launch Camera后,则调用系统的摄象头进行拍摄,用户剪裁图片后,应用的主界面将显示返回的图片,如下图:

小结

在本文中,带领读者开发了一个简单的Android手机的图像拍摄和剪裁的应用,图片的拍摄和剪裁是很实用的技术,特别在开发一些比如SNS的应用中,希望读者可以根据这个原理扩展开发出更多的实用程序。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值