在Android中实现图片的裁剪
本实例的功能是将用户选择的图片裁剪后放入ImagView,布局文件是个Button和ImageView。为了图片的正常显示,我们在裁剪后先将裁剪好的图片先存放到SD卡中,这样就能在以后开启应用的时候直接调用了。
main_activity.xml
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="${relativePackage}.${activityClass}" >
- <Button
- android:id="@+id/image_tailer_button_id"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true"
- android:text="裁剪图片" />
- <ImageView
- android:id="@+id/user_imageView_id"
- android:layout_width="300dp"
- android:layout_height="300dp"
- android:layout_above="@+id/image_tailer_button_id"
- android:layout_centerHorizontal="true"
- android:layout_marginBottom="100dp"
- android:src="@drawable/ic_launcher" />
- </RelativeLayout>
MainActivity.java
- package com.kale.imagetailor;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.drawable.BitmapDrawable;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.MediaStore;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- private String tag = getClass().getSimpleName();
- private static Uri imageUri;
- Button imageTailorBt;
- ImageView userIV;
- File file;
- FileManager fm;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- viewInit();
- fm = new FileManager();
- try {
- file = fm.creatSDFile("Kale Image", "userImage.jpg");
- } catch (IOException e) {
- // TODO 自动生成的 catch 块
- e.printStackTrace();
- }
- }
- /**
- *每次开启时判断设置什么图片,如果有自定义的图片了,那么就用用户自己的头像
- */
- private void setUserImage(){
- userIV.setImageResource(R.drawable.ic_launcher);
- //从sd卡中得到图片资源
- String filepath = fm.getFileWholePath();
- Bitmap bm = BitmapFactory.decodeFile(filepath);
- if(bm != null){
- //BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
- userIV.setImageDrawable(new BitmapDrawable(bm));
- }
- else{
- userIV.setImageResource(R.drawable.ic_launcher);
- }
- }
- private void viewInit(){
- userIV = (ImageView)findViewById(R.id.user_imageView_id);
- imageTailorBt = (Button)findViewById(R.id.image_tailer_button_id);
- imageTailorBt.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- // TODO 自动生成的方法存根
- changeUserImage();
- }
- });
- }
- /**
- *改变用户头像的方法,这里设定一个intent交给activity去处理
- */
- protected void changeUserImage(){
- Toast.makeText(getApplicationContext(), "更换头像", 0).show();
- imageUri = Uri.parse("file:///sdcard/temp.jpg");
- Intent intent = null;
- intent = new Intent(Intent.ACTION_GET_CONTENT, null);
- intent.setType("image/*");// 设置属性,表示获取任意类型的图片
- intent.putExtra("crop", "true");// 设置可以滑动选选择区域的属性,注意这里是字符串"true"
- intent.putExtra("aspectX", 1);// 设置剪切框1:1比例的效果
- intent.putExtra("aspectY", 1);// 设置剪切框1:1比例的效果
- intent.putExtra("outputX", 600);
- intent.putExtra("outputY", 600);
- intent.putExtra("scale", true);
- intent.putExtra("return-data", false);
- intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
- intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
- intent.putExtra("noFaceDetection", false); // no face detection
- startActivityForResult(intent, 1);
- }
- /**
- * @param uri
- * @return 一个bitmap对象,用来设置图片
- */
- private Bitmap decodeUriAsBitmap(Uri uri){
- Bitmap bitmap = null;
- try {
- bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- return null;
- }
- return bitmap;
- }
- /**
- * 用来设置图片,并保持的本地
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- //不正确的情况下
- if(resultCode != Activity.RESULT_OK){
- Log.e(tag, "requestCode = " + requestCode);
- Log.e(tag, "resultCode = " + resultCode);
- Log.e(tag, "data = " + data);
- return;
- }
- else{
- Log.d(tag, "CHOOSE_A_BIG_PICTURE: data = " + data);
- if(imageUri != null){
- Bitmap photo = decodeUriAsBitmap(imageUri);
- try {
- //保存到本地文件
- File pictureFile = file;
- FileOutputStream fos = new FileOutputStream(pictureFile);
- photo.compress(Bitmap.CompressFormat.JPEG, 100, fos);
- fos.close();
- Toast.makeText(this, "设置成功~", 0).show();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- Toast.makeText(this, "保存路径不存在", 0).show();
- } catch (IOException e) {
- e.printStackTrace();
- Toast.makeText(this, "设置图片失败", 0).show();
- }
- }
- }
- setUserImage();
- }
- }
里面用到的将图片存放到SD卡中的类
FileManager.java
- package com.kale.imagetailor;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import android.os.Environment;
- /**
- * @tips :
- * <!-- 读写SD卡的权限 -->
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- * @date :2014-6-30
- */
- public class FileManager {
- private String SD_PATH;
- private String fileName;
- private String dirName;
- public String getSD_PATH() {
- return SD_PATH;
- }
- public FileManager() {
- //得到当前外部存储设备的目录
- SD_PATH = Environment.getExternalStorageDirectory() + "/";
- }
- /**
- * 在SD卡上创建文件
- *
- * @throws IOException
- */
- public File creatSDFile(String dirName ,String fileName) throws IOException {
- this.fileName = fileName;
- this.dirName = dirName;
- File file = new File(creatSDDir(dirName), fileName);
- return file;
- }
- public String getFileWholePath(){
- return SD_PATH + dirName + "/" + fileName;
- }
- /**
- * 在SD卡上创建目录
- *
- * @param dirName
- */
- public File creatSDDir(String dirName) {
- File dir = new File(SD_PATH + dirName);
- dir.mkdir();
- return dir;
- }
- /**
- * 判断SD卡上的文件夹是否存在
- */
- public boolean isFileExist(String fileName ,String dirName){
- File file = new File(SD_PATH +dirName+"/"+ fileName);
- return file.exists();
- }
- /**
- * 将一个InputStream里面的数据写入到SD卡中
- */
- public File saveToSdCard(String dirName,String fileName,InputStream input){
- File file = null;
- OutputStream output = null;
- try{
- //创建目录
- creatSDDir(dirName);
- //建立文件
- file = creatSDFile(dirName ,fileName);
- output = new FileOutputStream(file);
- byte buffer [] = new byte[5 * 1024];
- int count = 0;
- while((count = input.read(buffer)) != -1){
- String str = new String(buffer,0,count);
- //str = new String(str.getBytes("iso-8859-1"),"utf-8");
- System.out.println("---------File Manager----start--------");
- System.out.println(str);
- System.out.println("---------File Manager-----end-------");
- output.write(buffer);
- }
- output.flush();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- finally{
- try{
- output.close();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }
- return file;
- }
- }
源码下载:http://download.csdn.net/detail/shark0017/7623057
在Android中实现图片的裁剪的更多相关文章
- android开发——从相冊中选择图片不裁剪
转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46864777 问题: 在郭神的第一行代码中,第8章的从相冊中选择图片这块,从相冊选 ...
- Android中的图片压缩
1.android中计算图片占用堆内存的kB大小跟图片本身的kB大小无关,而是根据图片的尺寸来计算的. 比如一张 480*320大小的图片占用的堆内存大小为: 480*320*4/1024=600kB ...
- Android 中对于图片的内存优化方法
Android 中对于图片的内存优化方法,需要的朋友可以参考一下 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...
- Android中获取图片的宽和高
在Android中,我们想获取图片的宽和高应该怎么办?一.正常加载图片的方法下获取宽和高 举一个简单的例子:创建一个图片的副本 //加载原图 Bitmap bmSrc = BitmapFactory. ...
- Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内存溢出的Bug
由于android获取图片过大是会出现内存溢出的Bug 07-02 05:10:13.792: E/AndroidRuntime(6016): java.lang.OutOfMemoryError 解 ...
- Android中9-Patch图片之理解
在android中,不仅可以将扩展名为.png,.jpg,.gif的普通图片作为图片资源,而且可以将扩展名为.9.png的9-Patch图片作为图片资源.扩展名为.png,.jpg,.gif的普通图片 ...
- Android笔记之 图片自由裁剪
前言--项目中须要用到对用户头像的裁剪和上传功能.关于裁剪.一開始是想自己来做,可是认为这个东西应该谷歌有开发吧,于是一搜索官方文档.果然有.于是.就果断无耻地用了Android自带有关于照片的自由裁 ...
- Android中,图片分辨率适配总结规则drawable drawable-mdpi drawable-hdpi drawable-nodpi drawable-ldpi
一直关于android多分辨率适配有些疑惑,从网上找到一些资料并通过测试验证,参考链接:http://blog.csdn.net/lamp_zy/article/details/7686477 现记录 ...
- Android中9patch图片格式(xx.9.png)介绍与制作详解
一:9patch图片介绍: android的.9.png是android系统中一种特殊的图片格式,专门用来用来处理图片大小变化后(如拉伸)的失真,不正常,如我们看到的qq聊天中的文字气泡,不管你输入的 ...
随机推荐
- #Plugin 环形loading插件
CircleLoader 环形loading插件 1.原生JS,不依赖jquery,zepto 2.前端学习交流群:814798690 案例展示 下载地址 https://github.com/cha ...
- JavaScript中变量的相互引用
http://www.jb51.net/article/23387.htm
- Codeforces 908F New Year and Rainbow Roads
New Year and Rainbow Roads 思路:我们考虑两个绿点之间的红点和蓝点, 首先把这些红点和蓝点接到绿点上面绝对不会超过绿点距离的两倍. 然后我们先把两个绿点连上, 再把绿点经过蓝 ...
- HDU - 1525
题意:给你两个数,a,b,有两个人轮流进行一次操作, 每次操作可以将大的数减去k倍的小的数,最后不能操作的人输了,问你谁赢了. 思路:我们可以用辗转相除法求出对于每一个状态可以改变几次,这样问题就变成 ...
- 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 ...
- codeforces_1092c
title: codeforces_1092c date: 2018-12-24 19:42:23 tags: acm 刷题 概述 一道有关字符串前缀后缀的题,,,自己迟早要坑在这字符串的题上,,,一 ...
- 3143 二叉树的序遍历codevs
题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i ...
- Loj10154 选课
试题描述: 大学实行学分制.每门课程都有一定的学分,学生只要选修了这门课并通过考核就能获得相应学分.学生最后的学分是他选修各门课的学分总和.每个学生都要选择规定数量的课程.其中有些课程可以直接选修,有 ...
- 利用最新的CentOS7.5,hadoop3.1,spark2.3.2搭建spark集群
1. 桥接模式,静态ip上外网:vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=EthernetPROXY_METHOD=noneBROWSER_ ...
- 在Asp.net core返回PushStream
最近用asp.net core webapi实现了一个实时视频流的推送功能,在Asp.net中,这个是通过PushStreamContent来实现的. 基于对asp.net core的知识,随手写了一 ...