Android开发之裁剪照片

请尊重他人的劳动成果,转载请注明出处:Android开发之裁剪照片

1.   从相册选择照片进行裁剪



从相册选择照片并裁剪:

/**
 * 从相册选择照片进行裁剪
 */
private void cropFromGallery() {
    // TODO Auto-generated method stub
    Intent intent=new Intent();
    intent.setAction(Intent.ACTION_PICK);//Pick an item from the data
    intent.setType("image/*");//从所有图片中进行选择
    intent.putExtra("crop", "true");//设置为裁切
    intent.putExtra("aspectX", 1);//裁切的宽比例
    intent.putExtra("aspectY", 1);//裁切的高比例
    intent.putExtra("outputX", 600);//裁切的宽度
    intent.putExtra("outputY", 600);//裁切的高度
    intent.putExtra("scale", true);//支持缩放
    intent.putExtra("return-data", false);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将裁切的结果输出到指定的Uri
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//裁切成的图片的格式
    intent.putExtra("noFaceDetection", true); // no face detection
    startActivityForResult(intent, SELECT_PIC);
}

将裁减好的照片显示在显示在ImagaView上:

case SELECT_PIC:
    if (resultCode==RESULT_OK) {
        try {
            Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().
                    openInputStream(imageUri));//将imageUri对象的图片加载到内存
            imgShow.setImageBitmap(bitmap);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    break;

程序运行效果图:

2.   从相机拍取照片进行裁剪



控制相机拍照并将照片保存到指定位置:

/**
 * 从相机拍取照片进行裁剪
 */
private void cropFromTake() {
    // TODO Auto-generated method stub
    Intent intent=new Intent();
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
    startActivityForResult(intent, TAKE_PIC);
}

裁剪已经排好的照片并显示在ImageView上:

case TAKE_PIC:
    if (resultCode==RESULT_OK) {
        cropImageUri(imageUri, 600, 600, CROP_PIC);
    }
    break;
/**
 * 裁剪指定uri对应的照片
 * @param imageUri:uri对应的照片
 * @param outputX:裁剪宽
 * @param outputY:裁剪高
 * @param requestCode:请求码
 */
private void cropImageUri(Uri imageUri, int outputX, int outputY, int requestCode){
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(imageUri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", outputX);
    intent.putExtra("outputY", outputY);
    intent.putExtra("scale", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    intent.putExtra("return-data", false);
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    intent.putExtra("noFaceDetection", true); // no face detection
    startActivityForResult(intent, requestCode);
}

程序运行效果图:

3.完整项目代码:


package com.jph.cp;

import java.io.File;
import java.io.FileNotFoundException;
import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;

/**
 * 从相册选择照片进行裁剪,从相机拍取照片进行裁剪
 * @author JPH
 * Date:2014.10.09
 */
public class MainActivity extends ActionBarActivity {
	private final static int SELECT_PIC=0x123;
	private final static int TAKE_PIC=0x124;
	private final static int CROP_PIC=0x125;
	private Uri imageUri;
	private ImageView imgShow;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//初始化imageUri
		imageUri=Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "test.jpg"));
		imgShow=(ImageView)findViewById(R.id.imgShow);
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		switch (requestCode) {
		case SELECT_PIC:
			if (resultCode==RESULT_OK) {
				try {
					Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().
							openInputStream(imageUri));//将imageUri对象的图片加载到内存
					imgShow.setImageBitmap(bitmap);
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			break;
		case TAKE_PIC:
			if (resultCode==RESULT_OK) {
				cropImageUri(imageUri, 600, 600, CROP_PIC);
			}
			break;
		case CROP_PIC:
			if (resultCode==RESULT_OK) {
				try {
					Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().
							openInputStream(imageUri));//将imageUri对象的图片加载到内存
					imgShow.setImageBitmap(bitmap);
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			break;
		default:
			break;
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
	/**
	 * 裁剪指定uri对应的照片
	 * @param imageUri:uri对应的照片
	 * @param outputX:裁剪宽
	 * @param outputY:裁剪高
	 * @param requestCode:请求码
	 */
	private void cropImageUri(Uri imageUri, int outputX, int outputY, int requestCode){
	    Intent intent = new Intent("com.android.camera.action.CROP");
	    intent.setDataAndType(imageUri, "image/*");
	    intent.putExtra("crop", "true");
	    intent.putExtra("aspectX", 1);
	    intent.putExtra("aspectY", 1);
	    intent.putExtra("outputX", outputX);
	    intent.putExtra("outputY", outputY);
	    intent.putExtra("scale", true);
	    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
	    intent.putExtra("return-data", false);
	    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
	    intent.putExtra("noFaceDetection", true); // no face detection
	    startActivityForResult(intent, requestCode);
	}

	public void cropPic(View view) {
		switch (view.getId()) {
		case R.id.btnCropFromGallery://从相册选择照片进行裁剪
			cropFromGallery();
			break;
		case R.id.btnCropFromTake://从相机拍取照片进行裁剪
			cropFromTake();
			break;

		default:
			break;
		}
	}
	/**
	 * 从相机拍取照片进行裁剪
	 */
	private void cropFromTake() {
		// TODO Auto-generated method stub
		Intent intent=new Intent();
		intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
		intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
		startActivityForResult(intent, TAKE_PIC);
	}
	/**
	 * 从相册选择照片进行裁剪
	 */
	private void cropFromGallery() {
		// TODO Auto-generated method stub
		Intent intent=new Intent();
		intent.setAction(Intent.ACTION_PICK);//Pick an item from the data
		intent.setType("image/*");//从所有图片中进行选择
		intent.putExtra("crop", "true");//设置为裁切
		intent.putExtra("aspectX", 1);//裁切的宽比例
		intent.putExtra("aspectY", 1);//裁切的高比例
		intent.putExtra("outputX", 600);//裁切的宽度
		intent.putExtra("outputY", 600);//裁切的高度
		intent.putExtra("scale", true);//支持缩放
		intent.putExtra("return-data", false);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将裁切的结果输出到指定的Uri
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//裁切成的图片的格式
		intent.putExtra("noFaceDetection", true); // no face detection
		startActivityForResult(intent, SELECT_PIC);
	}
}
时间: 2024-11-05 06:07:21

Android开发之裁剪照片的相关文章

Android开发之从相册选择照片

Android开发之从相册选择照片 请尊重他人的劳动成果,转载请注明出处:Android开发之从相册选择照片 我曾在 <Android开发之裁剪照片>一文中介绍过,如何从相册选取照片和拍摄照片并进行裁切,在本篇中主要向介绍从相册选择原生照片(不裁切). 第一步:向系统发送选择照片的意图. /** * 从相册选择原生的照片(不裁切) */ private void selectFromGallery() { // TODO Auto-generatedmethod stub Intentinte

Android开发技巧——大图裁剪

本篇内容是接上篇<Android开发技巧--定制仿微信图片裁剪控件> 的,先简单介绍对上篇所封装的裁剪控件的使用,再详细说明如何使用它进行大图裁剪,包括对旋转图片的裁剪. 裁剪控件的简单使用 XML代码 使用如普通控件一样,首先在布局文件里包含该控件: <com.githang.clipimage.ClipImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+i

Android开发技巧——定制仿微信图片裁剪控件

拍照--裁剪,或者是选择图片--裁剪,是我们设置头像或上传图片时经常需要的一组操作.上篇讲了Camera的使用,这篇讲一下我对图片裁剪的实现. 背景 下面的需求都来自产品. 裁剪图片要像微信那样,拖动和放大的是图片,裁剪框不动. 裁剪框外的内容要有半透明黑色遮罩. 裁剪框下面要显示一行提示文字(这点我至今还是持保留意见的). 在Android中,裁剪图片的控件库还是挺多的,特别是github上比较流行的几个,都已经进化到比较稳定的阶段,但比较遗憾的是它们的裁剪过程是拖动或缩放裁剪框,于是只好自己

Android开发中遇到的问题和解答汇总

如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面?<点击查看详情> android Intent 本身就可以附加数据 为何还用 bundle?<点击查看详情> android 做一个pdf阅读器项目,求思路<点击查看详情> iOS 和 Android 应用内部集成分享按钮的问题<点击查看详情> 保存在Application子类中的全局变量什么情况下会丢失?<点击查看详情> 如何理解这句话,安卓的,query参数

android开发常用组件和第三方库(二)

TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending, github搜索:https://github.com/search 目录 UI UI 卫星菜单 节选器 下拉刷新 模糊效果 HUD与Toast 进度条 UI其它 动画 网络相关 响应式编程 地图 数据库 图像浏览及处理 视频音频处理 测试及调试 动态更新热更新 消息推送 完整项目 插件 出名框架 其他 好的文章 收集android上开源的酷炫的交互动

Android开发在路上:少去踩坑,多走捷径【转】

作者:gzjay,腾讯MIG无线产品部 高级工程师 最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2.目前, 开发Android APP时,需要考虑的分辨率有哪些? 这两个问题可以合起来回答的. http://developer.android.com/about/dashboards/index.html 源自Google Play的数据,每月都会进行upd

腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(下)

文/腾讯公司 陈江峰 优测小优有话说: android开发的坑自然是不少,不想掉坑快来优测优社区~ 6.Android APP开发中其它需要提醒的问题 android4.4在UI线程无法进行网络操作.不单只android API版本不一定导致运行异常,有些机型还使用Java 1.5进行编译,使用某些Java 1.6的函数会Crash的.注意OOM问题,目前android手机已经有3G内存了,但并非一个应用就能使用全部内存.了解一下堆内存,一个软件至少一个进程,一个进程跑一个虚拟机,进程使用的堆内

Android开发之程序员必须要懂得Android的重要设计理念2

上篇文章介绍了Android开发的设计理念的一部分,并没有得到博友们的多大认可,只看到了一位博友在下面留言期待下一篇文章的发表,为了这小小的唯一支持,我决定继续把后面的8个要点介绍一下,自己也潜心反省一下,自己的理解是不是太浅薄. 二.增加易用性 (6)一样的标志,一样的功能 我们的程序 应该帮助人们通过视觉辨别就可以轻松判断该图案或者按钮代表着怎样的功能,能清晰的分辨出来,而不是让用户费劲脑筋的去猜想这个按钮可能代表什么功能.我们的程序应该极力避免一种情况,类似的图案或者按钮却在不同的地方,代

Android开发技术周报 Issue#64

教程 AndroidFlux-异步请求和网络 在移动开发中,异步网络操作必不可少,本篇着重介绍在Flux模式中如何处理异步操作的问题,并深入一些细节,比如如何在异步操作时显示异步状态.另外,网络操作仅仅是异步操作的一种,最后扩展ActionCreator的语义来处理更多的业务逻辑. Tricking Android MemoryFile MemoryFile是android在最开始就引入的一套框架,其内部实际上是封装了android特有的内存共享机制Ashmem匿名共享内存,简单来说,Ashme