本实例的功能是将用户选择的图片裁剪后放入ImagView,布局文件是个Button和ImageView。为了图片的正常显示,我们在裁剪后先将裁剪好的图片先存放到SD卡中,这样就能在以后开启应用的时候直接调用了。

main_activity.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="${relativePackage}.${activityClass}" >
  6.  
  7. <Button
  8. android:id="@+id/image_tailer_button_id"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:layout_centerHorizontal="true"
  12. android:layout_centerVertical="true"
  13. android:text="裁剪图片" />
  14.  
  15. <ImageView
  16. android:id="@+id/user_imageView_id"
  17. android:layout_width="300dp"
  18. android:layout_height="300dp"
  19. android:layout_above="@+id/image_tailer_button_id"
  20. android:layout_centerHorizontal="true"
  21. android:layout_marginBottom="100dp"
  22. android:src="@drawable/ic_launcher" />
  23.  
  24. </RelativeLayout>

MainActivity.java

  1. package com.kale.imagetailor;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import android.app.Activity;
  8. import android.content.Intent;
  9. import android.graphics.Bitmap;
  10. import android.graphics.BitmapFactory;
  11. import android.graphics.drawable.BitmapDrawable;
  12. import android.net.Uri;
  13. import android.os.Bundle;
  14. import android.provider.MediaStore;
  15. import android.util.Log;
  16. import android.view.View;
  17. import android.view.View.OnClickListener;
  18. import android.widget.Button;
  19. import android.widget.ImageView;
  20. import android.widget.Toast;
  21.  
  22. public class MainActivity extends Activity {
  23.  
  24. private String tag = getClass().getSimpleName();
  25. private static Uri imageUri;
  26.  
  27. Button imageTailorBt;
  28. ImageView userIV;
  29. File file;
  30. FileManager fm;
  31.  
  32. @Override
  33. protected void onCreate(Bundle savedInstanceState) {
  34. super.onCreate(savedInstanceState);
  35. setContentView(R.layout.activity_main);
  36. viewInit();
  37. fm = new FileManager();
  38. try {
  39. file = fm.creatSDFile("Kale Image", "userImage.jpg");
  40. } catch (IOException e) {
  41. // TODO 自动生成的 catch 块
  42. e.printStackTrace();
  43. }
  44. }
  45.  
  46. /**
  47. *每次开启时判断设置什么图片,如果有自定义的图片了,那么就用用户自己的头像
  48. */
  49. private void setUserImage(){
  50. userIV.setImageResource(R.drawable.ic_launcher);
  51. //从sd卡中得到图片资源
  52. String filepath = fm.getFileWholePath();
  53. Bitmap bm = BitmapFactory.decodeFile(filepath);
  54.  
  55. if(bm != null){
  56. //BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
  57. userIV.setImageDrawable(new BitmapDrawable(bm));
  58. }
  59. else{
  60. userIV.setImageResource(R.drawable.ic_launcher);
  61. }
  62. }
  63.  
  64. private void viewInit(){
  65. userIV = (ImageView)findViewById(R.id.user_imageView_id);
  66. imageTailorBt = (Button)findViewById(R.id.image_tailer_button_id);
  67. imageTailorBt.setOnClickListener(new OnClickListener() {
  68.  
  69. @Override
  70. public void onClick(View arg0) {
  71. // TODO 自动生成的方法存根
  72. changeUserImage();
  73. }
  74. });
  75. }
  76.  
  77. /**
  78. *改变用户头像的方法,这里设定一个intent交给activity去处理
  79. */
  80. protected void changeUserImage(){
  81. Toast.makeText(getApplicationContext(), "更换头像", 0).show();
  82. imageUri = Uri.parse("file:///sdcard/temp.jpg");
  83.  
  84. Intent intent = null;
  85. intent = new Intent(Intent.ACTION_GET_CONTENT, null);
  86. intent.setType("image/*");// 设置属性,表示获取任意类型的图片
  87. intent.putExtra("crop", "true");// 设置可以滑动选选择区域的属性,注意这里是字符串"true"
  88. intent.putExtra("aspectX", 1);// 设置剪切框1:1比例的效果
  89. intent.putExtra("aspectY", 1);// 设置剪切框1:1比例的效果
  90. intent.putExtra("outputX", 600);
  91. intent.putExtra("outputY", 600);
  92. intent.putExtra("scale", true);
  93. intent.putExtra("return-data", false);
  94. intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
  95. intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
  96. intent.putExtra("noFaceDetection", false); // no face detection
  97. startActivityForResult(intent, 1);
  98. }
  99.  
  100. /**
  101. * @param uri
  102. * @return 一个bitmap对象,用来设置图片
  103. */
  104. private Bitmap decodeUriAsBitmap(Uri uri){
  105. Bitmap bitmap = null;
  106. try {
  107. bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
  108. } catch (FileNotFoundException e) {
  109. e.printStackTrace();
  110. return null;
  111. }
  112. return bitmap;
  113. }
  114.  
  115. /**
  116. * 用来设置图片,并保持的本地
  117. */
  118. @Override
  119. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  120. super.onActivityResult(requestCode, resultCode, data);
  121. //不正确的情况下
  122. if(resultCode != Activity.RESULT_OK){
  123. Log.e(tag, "requestCode = " + requestCode);
  124. Log.e(tag, "resultCode = " + resultCode);
  125. Log.e(tag, "data = " + data);
  126. return;
  127. }
  128. else{
  129. Log.d(tag, "CHOOSE_A_BIG_PICTURE: data = " + data);
  130. if(imageUri != null){
  131. Bitmap photo = decodeUriAsBitmap(imageUri);
  132. try {
  133. //保存到本地文件
  134. File pictureFile = file;
  135. FileOutputStream fos = new FileOutputStream(pictureFile);
  136. photo.compress(Bitmap.CompressFormat.JPEG, 100, fos);
  137. fos.close();
  138. Toast.makeText(this, "设置成功~", 0).show();
  139.  
  140. } catch (FileNotFoundException e) {
  141. e.printStackTrace();
  142. Toast.makeText(this, "保存路径不存在", 0).show();
  143. } catch (IOException e) {
  144. e.printStackTrace();
  145. Toast.makeText(this, "设置图片失败", 0).show();
  146. }
  147. }
  148. }
  149. setUserImage();
  150. }
  151. }

里面用到的将图片存放到SD卡中的类

FileManager.java

  1. package com.kale.imagetailor;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. import android.os.Environment;
  10.  
  11. /**
  12. * @tips :
  13. * <!-- 读写SD卡的权限 -->
  14. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  15. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  16. * @date :2014-6-30
  17. */
  18. public class FileManager {
  19. private String SD_PATH;
  20. private String fileName;
  21. private String dirName;
  22.  
  23. public String getSD_PATH() {
  24. return SD_PATH;
  25. }
  26. public FileManager() {
  27. //得到当前外部存储设备的目录
  28. SD_PATH = Environment.getExternalStorageDirectory() + "/";
  29. }
  30. /**
  31. * 在SD卡上创建文件
  32. *
  33. * @throws IOException
  34. */
  35. public File creatSDFile(String dirName ,String fileName) throws IOException {
  36. this.fileName = fileName;
  37. this.dirName = dirName;
  38. File file = new File(creatSDDir(dirName), fileName);
  39. return file;
  40. }
  41.  
  42. public String getFileWholePath(){
  43. return SD_PATH + dirName + "/" + fileName;
  44. }
  45.  
  46. /**
  47. * 在SD卡上创建目录
  48. *
  49. * @param dirName
  50. */
  51. public File creatSDDir(String dirName) {
  52. File dir = new File(SD_PATH + dirName);
  53. dir.mkdir();
  54. return dir;
  55. }
  56.  
  57. /**
  58. * 判断SD卡上的文件夹是否存在
  59. */
  60. public boolean isFileExist(String fileName ,String dirName){
  61. File file = new File(SD_PATH +dirName+"/"+ fileName);
  62. return file.exists();
  63. }
  64.  
  65. /**
  66. * 将一个InputStream里面的数据写入到SD卡中
  67. */
  68. public File saveToSdCard(String dirName,String fileName,InputStream input){
  69. File file = null;
  70. OutputStream output = null;
  71. try{
  72. //创建目录
  73. creatSDDir(dirName);
  74. //建立文件
  75. file = creatSDFile(dirName ,fileName);
  76. output = new FileOutputStream(file);
  77. byte buffer [] = new byte[5 * 1024];
  78. int count = 0;
  79. while((count = input.read(buffer)) != -1){
  80. String str = new String(buffer,0,count);
  81. //str = new String(str.getBytes("iso-8859-1"),"utf-8");
  82. System.out.println("---------File Manager----start--------");
  83. System.out.println(str);
  84. System.out.println("---------File Manager-----end-------");
  85. output.write(buffer);
  86. }
  87. output.flush();
  88. }
  89. catch(Exception e){
  90. e.printStackTrace();
  91. }
  92. finally{
  93. try{
  94. output.close();
  95. }
  96. catch(Exception e){
  97. e.printStackTrace();
  98. }
  99. }
  100. return file;
  101. }
  102.  
  103. }

源码下载:http://download.csdn.net/detail/shark0017/7623057

在Android中实现图片的裁剪的更多相关文章

  1. android开发——从相冊中选择图片不裁剪

    转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46864777 问题: 在郭神的第一行代码中,第8章的从相冊中选择图片这块,从相冊选 ...

  2. Android中的图片压缩

    1.android中计算图片占用堆内存的kB大小跟图片本身的kB大小无关,而是根据图片的尺寸来计算的. 比如一张 480*320大小的图片占用的堆内存大小为: 480*320*4/1024=600kB ...

  3. Android 中对于图片的内存优化方法

    Android 中对于图片的内存优化方法,需要的朋友可以参考一下     1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...

  4. Android中获取图片的宽和高

    在Android中,我们想获取图片的宽和高应该怎么办?一.正常加载图片的方法下获取宽和高 举一个简单的例子:创建一个图片的副本 //加载原图 Bitmap bmSrc = BitmapFactory. ...

  5. Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内存溢出的Bug

    由于android获取图片过大是会出现内存溢出的Bug 07-02 05:10:13.792: E/AndroidRuntime(6016): java.lang.OutOfMemoryError 解 ...

  6. Android中9-Patch图片之理解

    在android中,不仅可以将扩展名为.png,.jpg,.gif的普通图片作为图片资源,而且可以将扩展名为.9.png的9-Patch图片作为图片资源.扩展名为.png,.jpg,.gif的普通图片 ...

  7. Android笔记之 图片自由裁剪

    前言--项目中须要用到对用户头像的裁剪和上传功能.关于裁剪.一開始是想自己来做,可是认为这个东西应该谷歌有开发吧,于是一搜索官方文档.果然有.于是.就果断无耻地用了Android自带有关于照片的自由裁 ...

  8. Android中,图片分辨率适配总结规则drawable drawable-mdpi drawable-hdpi drawable-nodpi drawable-ldpi

    一直关于android多分辨率适配有些疑惑,从网上找到一些资料并通过测试验证,参考链接:http://blog.csdn.net/lamp_zy/article/details/7686477 现记录 ...

  9. Android中9patch图片格式(xx.9.png)介绍与制作详解

    一:9patch图片介绍: android的.9.png是android系统中一种特殊的图片格式,专门用来用来处理图片大小变化后(如拉伸)的失真,不正常,如我们看到的qq聊天中的文字气泡,不管你输入的 ...

随机推荐

  1. #Plugin 环形loading插件

    CircleLoader 环形loading插件 1.原生JS,不依赖jquery,zepto 2.前端学习交流群:814798690 案例展示 下载地址 https://github.com/cha ...

  2. JavaScript中变量的相互引用

    http://www.jb51.net/article/23387.htm  

  3. Codeforces 908F New Year and Rainbow Roads

    New Year and Rainbow Roads 思路:我们考虑两个绿点之间的红点和蓝点, 首先把这些红点和蓝点接到绿点上面绝对不会超过绿点距离的两倍. 然后我们先把两个绿点连上, 再把绿点经过蓝 ...

  4. HDU - 1525

    题意:给你两个数,a,b,有两个人轮流进行一次操作, 每次操作可以将大的数减去k倍的小的数,最后不能操作的人输了,问你谁赢了. 思路:我们可以用辗转相除法求出对于每一个状态可以改变几次,这样问题就变成 ...

  5. 029 RDD Join相关API,以及程序

    1.数据集 A表数据: 1 a 2 b 3 c B表数据: 1 aa1 1 aa2 2 bb1 2 bb2 2 bb3 4 dd1 2.join的分类 inner join left outer jo ...

  6. codeforces_1092c

    title: codeforces_1092c date: 2018-12-24 19:42:23 tags: acm 刷题 概述 一道有关字符串前缀后缀的题,,,自己迟早要坑在这字符串的题上,,,一 ...

  7. 3143 二叉树的序遍历codevs

    题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i ...

  8. Loj10154 选课

    试题描述: 大学实行学分制.每门课程都有一定的学分,学生只要选修了这门课并通过考核就能获得相应学分.学生最后的学分是他选修各门课的学分总和.每个学生都要选择规定数量的课程.其中有些课程可以直接选修,有 ...

  9. 利用最新的CentOS7.5,hadoop3.1,spark2.3.2搭建spark集群

    1. 桥接模式,静态ip上外网:vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=EthernetPROXY_METHOD=noneBROWSER_ ...

  10. 在Asp.net core返回PushStream

    最近用asp.net core webapi实现了一个实时视频流的推送功能,在Asp.net中,这个是通过PushStreamContent来实现的. 基于对asp.net core的知识,随手写了一 ...