文档章节

解决大图片裁剪问题的详细代码(可直接粘贴复用)

今日竹石
 今日竹石
发布于 2014/04/16 15:33
字数 588
阅读 102
收藏 1

MainActivity中的代码

package com.mzba.photocrop;


import java.io.File;

import java.io.FileNotFoundException;

import java.io.IOException;


import android.app.Activity;

import android.app.AlertDialog;

import android.content.ActivityNotFoundException;

import android.content.Context;

import android.content.DialogInterface;

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.ContextThemeWrapper;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.ListAdapter;

import android.widget.TextView;

/**

 * Android大图裁剪解决办法

 * @author  06peng

 * @see  http://06peng.com

 *

 */

public class MainActivity extends Activity {

private ImageView imageView;

private TextView textView;

private File picFile;

private Uri photoUri;

private final int activity_result_camara_with_data = 1006;

private final int activity_result_cropimage_with_data = 1007;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imageView = (ImageView) findViewById(R.id.image);

textView = (TextView) findViewById(R.id.click);

textView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

doPickPhotoAction();

}

});

}


private void doPickPhotoAction() {

final Context dialogContext = new ContextThemeWrapper(this, android.R.style.Theme_Light);

String cancel = "Back";

String[] choices;

choices = new String[2];

choices[0] = "Take Photo"; // 拍照

choices[1] = "Choose Photo"; // 从相册中选择

final ListAdapter adapter = new ArrayAdapter<String>(dialogContext,

android.R.layout.simple_list_item_1, choices);


final AlertDialog.Builder builder = new AlertDialog.Builder(dialogContext);

builder.setTitle("Choose Photo");

builder.setSingleChoiceItems(adapter, -1,

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

switch (which) {

case 0:

String status = Environment.getExternalStorageState();

if (status.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有SD卡

doTakePhoto();// 用户点击了从照相机获取

}

break;

case 1:

doCropPhoto();// 从相册中去获取

break;

}

}

});

builder.setNegativeButton(cancel,

new DialogInterface.OnClickListener() {


@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

}


});

builder.create().show();

}


/**

* 拍照获取图片

*/

protected void doTakePhoto() {

try {

File uploadFileDir = new File(Environment.getExternalStorageDirectory(), "/upload");

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

if (!uploadFileDir.exists()) {

uploadFileDir.mkdirs();

}

picFile = new File(uploadFileDir, "upload.jpeg");

if (!picFile.exists()) {

picFile.createNewFile();

}

photoUri = Uri.fromFile(picFile);

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);

startActivityForResult(cameraIntent, activity_result_camara_with_data);

} catch (ActivityNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

protected void doCropPhoto() {

try {

File pictureFileDir = new File(Environment.getExternalStorageDirectory(), "/upload");

if (!pictureFileDir.exists()) {

pictureFileDir.mkdirs();

}

picFile = new File(pictureFileDir, "upload.jpeg");

if (!picFile.exists()) {

picFile.createNewFile();

}

photoUri = Uri.fromFile(picFile);

final Intent intent = getCropImageIntent();

startActivityForResult(intent, activity_result_cropimage_with_data);

} catch (Exception e) {

e.printStackTrace();

}

}


/**

* Constructs an intent for image cropping. 调用图片剪辑程序

*/

public Intent getCropImageIntent() {

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);

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("noFaceDetection", true);

intent.putExtra("scale", true);

intent.putExtra("return-data", false);

intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);

intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

return intent;

}

private void cropImageUriByTakePhoto() {

Intent intent = new Intent("com.android.camera.action.CROP");

intent.setDataAndType(photoUri, "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(MediaStore.EXTRA_OUTPUT, photoUri);

intent.putExtra("return-data", false);

intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

intent.putExtra("noFaceDetection", true); // no face detection

startActivityForResult(intent, activity_result_cropimage_with_data);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode) {

case activity_result_camara_with_data: // 拍照

try {

cropImageUriByTakePhoto();

} catch (Exception e) {

e.printStackTrace();

}

break;

case activity_result_cropimage_with_data:

try {

if (photoUri != null) {

Bitmap bitmap = decodeUriAsBitmap(photoUri);

imageView.setImageBitmap(bitmap);

}

} catch (Exception e) {

e.printStackTrace();

}

break;

}

}

private Bitmap decodeUriAsBitmap(Uri uri) {

Bitmap bitmap = null;

try {

bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));

} catch (FileNotFoundException e) {

e.printStackTrace();

return null;

}

return bitmap;

}

}

在清单文件中:

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.mzba.photocrop"

    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="19" />

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

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.mzba.photocrop.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>


</manifest>


© 著作权归作者所有

共有 人打赏支持
今日竹石
粉丝 41
博文 227
码字总数 181312
作品 0
朝阳
程序员
Android大图片裁剪终极解决方案(上:原理分析)

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/86842 约几个月前,我正为公司的APP在Android手机上实现...

RyanHoo
2012/11/03
0
11
Jcrop 整合 FileAPI 图像裁剪上传

Jcrop是一款优秀的jQuery插件,可以非常方便地实现图像裁剪,而且功能十分的强大。 一般的情况下,图像裁剪的实现要经过两次图像上传,第一次将图片上传到后台,后台返回一个链接,通过这个链...

Acce1erator
2015/12/28
234
0
Android大图片裁剪解决方案

截图原理 在Android中,Intent触发Camera程序,拍好照片后,将会返回数据,但是考虑到内存问题,Camera不会将全尺寸的图像返回给调用的Activity,一般情况下,有可能返回的是缩略图,比如120...

今日竹石
2014/04/15
0
0
Android大图片裁剪终极解决方案(中:从相册截图)

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/86853 在这篇博客中,我将向大家展示如何从相册截图。 ...

RyanHoo
2012/11/03
0
14
Android大图片裁剪终极解决方案(上:原理分析)

约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已。 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项...

小克898
2012/11/12
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
36分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
2
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0
Android中的设计模式之命令模式

参考 《设计模式:可复用面向对象软件的基础 》5.2 Command 命令 对象行为型模式 《Android源码设计模式解析与实战》第11章 让程序畅通执行--命令模式 意图 将一个请求封装为一个对象,从而使...

newtrek
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部