文档章节

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

今日竹石
 今日竹石
发布于 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

没有更多内容

加载失败,请刷新页面

加载更多

打包QML程序

1、windeployqt执行路径(D:\Qt\5.12.0\msvc2017_64\bin)加入到PATH中 2、使用Qt自带的命令行交互 Command 终端(Qt 5.12.0 64-bit for Desktop (MSVC 2017))切换到 Release 编译成功的exe...

渣渣曦
35分钟前
3
0
优秀互联网高级测试工程师应该具备的能力

概述 在之前写的互联网高级测试工程师至少具备的能力一文中,提到了测试工程师至少具备的能力,但是并没有提到优秀测试工程师应该具备的能力,下文简单的谈一谈。当然这些全部都是我的个人理...

Sam哥哥聊技术
38分钟前
3
0
webpack项目配置

前端工程化 前端工程化是根据业务特点,将前端开发流程规范化,标准化,它包括了开发流程、技术选型、代码规范、构建发布等等,用语提升前端工程师的开发效率和代码质量。 自动化构建工具 1、...

羊皮卷
41分钟前
1
0
Linux命令备忘录: jobs 显示Linux中的任务列表及任务状态命令

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的...

开元中国2015
今天
3
0
springboot Whitelabel Error Page(Not Found)解决方案

当出现上图图的错误时注意 报错信息 There was an unexpected error (type=Not Found, status=404). Not Found代表未访问到资源 解决方案:比较访问路径和代码的路径有没有写错 正确的访问路...

斩神魂
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部