Android实现图片裁剪
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();
}
}
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;
} }
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>
代码:http://download.csdn.net/detail/shark0017/7623057
Android实现图片裁剪的更多相关文章
- Android大图片裁剪终极解决方案(上:原理分析)
转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/86842 约几个月前,我正 ...
- Android大图片裁剪终极解决方案 原理分析
约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已. 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏 ...
- Android大图片裁剪终极解决方案(下:拍照截图)
http://blog.csdn.net/floodingfire/article/details/8144617 http://mzh3344258.blog.51cto.com/1823534/8 ...
- [Android] 图片裁剪总结——调用系统裁剪
花了两天时间看了下android的图片裁剪功能的实现.其实刚开始做这个我挺虚的,以为整个功能都需要自己写出来,但查了些资料,发现android已经提供了裁剪功能,需要的话自己调用就成了.soga,这下 ...
- Android开发技巧——定制仿微信图片裁剪控件
拍照--裁剪,或者是选择图片--裁剪,是我们设置头像或上传图片时经常需要的一组操作.上篇讲了Camera的使用,这篇讲一下我对图片裁剪的实现. 背景 下面的需求都来自产品. 裁剪图片要像微信那样,拖动 ...
- Android大图片之缩略图,以及对原图依照指定宽高裁剪成缩略图
<Android大图片之变换缩略图,以及对原始大图片依照指定宽.高裁剪成缩略图> 在Android的ImageView载入图像资源过程中,出于性能和内存开销的须要.有时候须要把一个原 ...
- Android第三方开源图片裁剪截取:cropper
Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...
- Android 系统自带图片裁剪功能(适配7.0、8.0、对了还有小米手机)
前段时间写了如何获取相册和拍照之后的照片并且进行显示和上传,这一次是如何进行圆形图像制作,经常看我写的笔记的人会知道,我很懒.那么我就懒的自定义了,目前需求就用原生的就好了,大神的轮子,我会在后面进行 ...
- Android 图片裁剪库 uCrop
引语 晚上好,我是猫咪,我的公众号「程序媛猫咪」会推荐 GitHub 上好玩的项目,挖掘开源的价值,欢迎关注我. 现在 Android 开发,离不开图片,必然也需要图片裁剪功能,这个实现可以调用系统的 ...
随机推荐
- React 中 context 的使用
官方文档说明(英) 看了别人写的中文博客,再看了官方英文文档,发现还是官方文档讲的浅显易懂一些,看了之后,半翻译半理解地写了这篇博客,更易于新手理解. 介绍 context 是在 react @ 0. ...
- 【推荐】关于JS中的constructor与prototype【转】
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
- 【LOJ】#2494. 「AHOI / HNOI2018」寻宝游戏
题面 题解 第\(i\)个数之前的符号是或那么记为0,是与就记为1,得到一个二进数x 然后按位分开考虑,如果这一行是1那么记为1,如果这一位数位0记为0,得到一个二进制数\(b_i\) 第\(N\)行 ...
- 在 Vim 中优雅地查找和替换
原文更好看链接http://harttle.com/2016/08/08/vim-search-in-file.html 总有人问我 Vim 中能不能查找,当然能!而且是超级强的查找! 这篇文章来详细 ...
- ADNI以及study design简介
相关名词: MCI:轻度认知功能障碍 EMCI:早期认知障碍 MCI:轻度认知障碍 LMCI:晚期认知障碍 CN:认知正常的志愿者 DTI:doppler tissue imaging,多普勒组织显像 ...
- 002.MMM高可用MySQL简介
一 简介 MMM即Multi-Master Replication Manager for MySQL:mysql多主复制管理器,基于perl实现,关于mysql主主复制配置的监控.故障转移和管理的一 ...
- 007.KVM虚机时间-快照管理
一 快照管理 1.1 创建快照 [root@kvm-host ~]# virsh snapshot-create vm03-centos6.8 [root@kvm-host ~]# virsh sna ...
- Web大前端面试题-Day1
1. var的变量提升的底层原理是什么? JS引擎的工作方式是:1) 先解析代码,获取所有被声明的变量:2)然后在运行.也就是说分为预处理和执行两个阶段. 变量提升:所有变量的声明语句都会被提升到代码 ...
- "Unchecked-Send"漏洞分析
author:sf197tl;dr国内并没有一个文档有讲述该漏洞的,正好闲着没事.就写下这篇文章.在网上也搜寻了一些资料,通过自己的翻译才有今天的这篇文章.该漏洞在DASP TOP 10中可以查看到. ...
- Android利用ViewPager实现滑动广告板
•android-support-v4.jar,这是谷歌官方 给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其 ...