文档章节

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

今日竹石
 今日竹石
发布于 2014/04/16 15:33
字数 588
阅读 103
收藏 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
朝阳
程序员
私信 提问
燃烧我的卡路里 ---- Flutter瘦内存瘦包之图片组件

作者:闲鱼技术-炉军 背景 在电商类APP里,图片到现在为止仍然是最重要的信息承载媒介,不得不说逛淘宝的过程,其实就是一个看图片的过程。而商品详情页中的图片,通常是页面中内存占用最多的...

闲鱼技术
04/04
0
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大图片裁剪终极解决方案(中:从相册截图)

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

RyanHoo
2012/11/03
0
14
Android大图片裁剪解决方案

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

今日竹石
2014/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

泛型就这么简单

前言 从今天开始进入Java基础的复习,可能一个星期会有一篇的<十道简单算法>,我写博文的未必都是正确的~如果有写错的地方请大家多多包涵并指正~ 今天要复习的是泛型,泛型在Java中也是个很...

群星纪元
30分钟前
3
0
大数据提醒你:中国这些古建筑,可能是下一个巴黎圣母院!

大家晚上好,我是今天的提笔人嗅嗅。 巴黎圣母院失火事件让我的心情很沉重,一句无关痛痒的安慰“巴黎不哭”,已经不能表达我对这场文化之殇的惋惜之痛,人类伟大的建筑在一瞬间被毁灭。 世界...

forespider
42分钟前
0
0
mysql函数substring_index的用法

substring_index 按索引字符位进行截取字符串 substring_index(“待截取的字符串”,“截取数据依据的字符”,截取字符的位置N) 第三个参数可正,可负。正数表示索引字符前面的字符串,负数...

echojson
42分钟前
2
0
好程序员web前端分享用CSS和JS打造一个简单的图片编辑器

好程序员web前端分享用CSS和JS打造一个简单的图片编辑器,本文主要是利用CSS的 filter和简单的Jquery代码来实现一个简单的图片编辑器,包括对图片的透明度,黑白,图片亮度等调节。 CSS filt...

好程序员IT
51分钟前
2
0
浅析spring mvc的细节

spring mvc 整体结构 系统监听到请求 -> 通知tomcat -> 根据web.xml 通知相应的拦截器(spring mvc 通常指DispatcherServlet) --> 检查url是否有相匹配的请求实现 --> 拿到请求实现bean的适配...

最爱肉肉
53分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部