Android实现从本地图库/相机拍照后裁剪图片并设置头像
作者:wzben
字体:[ ] 类型:转载 时间:
玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片,接下来通过本文给大家介绍Android实现从本地图库/相机拍照后裁剪图片并设置头像,需要的朋友参考下
玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片。上述过程已经实现好了,最后一步我加上了把截取好的图片在保存到本地的操作,来保存头像。为了大家需要,下面脚本之家小编把完整的代码贴出来供大家参考。
先给大家展示效果图:
代码部分:
布局代码(其实就是两个按钮和一个ImageView来显示头像)
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" &
&ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/buttonLocal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="本地相册选取头像" /&
android:id="@+id/buttonCamera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="手机拍照选取头像" /&
&/LinearLayout&
正文代码:
public class MainActivity extends AppCompatActivity {
/* 头像文件 */
private static final String IMAGE_FILE_NAME = "temp_head_image.jpg";
/* 请求识别码 */
private static final int CODE_GALLERY_REQUEST = 0xa0;//本地
private static final int CODE_CAMERA_REQUEST = 0xa1;//拍照
private static final int CODE_RESULT_REQUEST = 0xa2;//最终裁剪后的结果
// 裁剪后图片的宽(X)和高(Y),480 X 480的正方形。
private static int output_X = 600;
private static int output_Y = 600;
private ImageView headImage =
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
headImage = (ImageView) findViewById(R.id.imageView);
Button buttonLocal = (Button) findViewById(R.id.buttonLocal);
buttonLocal.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
choseHeadImageFromGallery();
Button buttonCamera = (Button) findViewById(R.id.buttonCamera);
buttonCamera.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
choseHeadImageFromCameraCapture();
// 从本地相册选取图片作为头像
private void choseHeadImageFromGallery() {
Intent intentFromGallery = new Intent();
// 设置文件类型
intentFromGallery.setType("image/*");//选择图片
intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
//如果你想在Activity中得到新打开Activity关闭后返回的数据,
//你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity
startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);
// 启动手机相机拍摄照片作为头像
private void choseHeadImageFromCameraCapture() {
Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判断存储卡是否可用,存储照片文件
if (hasSdcard()) {
intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(), IMAGE_FILE_NAME)));
startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST);
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
// 用户没有进行有效的设置操作,返回
if (resultCode == RESULT_CANCELED) {//取消
Toast.makeText(getApplication(), "取消", Toast.LENGTH_LONG).show();
switch (requestCode) {
case CODE_GALLERY_REQUEST://如果是来自本地的
cropRawPhoto(intent.getData());//直接裁剪图片
case CODE_CAMERA_REQUEST:
if (hasSdcard()) {
File tempFile = new File(
Environment.getExternalStorageDirectory(),
IMAGE_FILE_NAME);
cropRawPhoto(Uri.fromFile(tempFile));
Toast.makeText(getApplication(), "没有SDCard!", Toast.LENGTH_LONG)
case CODE_RESULT_REQUEST:
if (intent != null) {
setImageToHeadView(intent);//设置图片框
super.onActivityResult(requestCode, resultCode, intent);
* 裁剪原始的图片
public void cropRawPhoto(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//把裁剪的数据填入里面
// 设置裁剪
intent.putExtra("crop", "true");
// aspectX , aspectY :宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX , outputY : 裁剪图片宽高
intent.putExtra("outputX", output_X);
intent.putExtra("outputY", output_Y);
intent.putExtra("return-data", true);
startActivityForResult(intent, CODE_RESULT_REQUEST);
* 提取保存裁剪之后的图片数据,并设置头像部分的View
private void setImageToHeadView(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
headImage.setImageBitmap(photo);
&br& //新建文件夹 先选好路径 再调用mkdir函数 现在是根目录下面的Ask文件夹
File nf = new File(Environment.getExternalStorageDirectory()+"/Ask");
nf.mkdir();
&br& //在根目录下面的ASk文件夹下 创建okkk.jpg文件
File f = new File(Environment.getExternalStorageDirectory()+"/Ask", "okkk.jpg");
FileOutputStream out =
try {&br&&br& //打开输出流 将图片数据填入文件中
out = new FileOutputStream(f);
pressFormat.PNG, 90, out);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
* 检查设备是否存在SDCard的工具方法
public static boolean hasSdcard() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
// 有存储的SDCard
因为涉及到文件读写,要加入两个权限!!!
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
&uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/&
关于本文给大家介绍的Android实现从本地图库/相机拍照后裁剪图片并设置头像的相关知识就给大家介绍到这里,希望对大家有所帮助!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具您所在的位置: >
怎么用PS消除照片中多余的东西(PS cs5操作实例)
发布日期:12-29
编辑:第9电脑网
●你是否曾因拍旅游照时按下快门的瞬间出现了不速之客感到烦恼&&
●你是否因自己拍摄的精美风景片中出现大煞风景的电线等杂物感到遗憾&&
●Photoshop CS5的&智能填充功能&可以轻松地帮你消除一些照片中的多余景物&&
很多爱美的人,要求完美的人总是不愿自己的生活中留下任何可以去掉的瑕疵,下面是使用Photoshop CS5的一点粗浅的体会与大家共享如何用PS去掉照片里面多余的人或者字,多余的自己不想要的东西!
在使用Photoshop 过程中,感觉新版本CS5中,其&智能填充功能&在处理、去除照片中的多余景物方面的功能非常给力,而且操作简单、便捷,使用效果比其他修复工具如:&仿制图章&等工具要更好用、更方便、更智能。
下面谈谈使用CS5去除照片中多余景物的几种方法:
一.使用&智能填充功能&之&& 【内容识别】法,去掉照片中多余的景物的方法
&这种方法适用于去除面积略大的多余景物
使用CS5&智能填充功能&去除多余景物时,只需两个步骤即可完成:
[1] 用选择工具&选中&需要去除的&多余的景物&(例如:利用【矩形】、【圆形】、【套索】、【钢笔】等工具)
[2 ] 点击【内容识别】选项,CS5会自动去除&多余的景物&,在去除&多余的景物&后,不会留下空白,CS5可以自动填充清除后的图片背景,使照片恢复完整的背景。处理智能,操作简单。
在下面这张照片中,我们假设要去掉地面上的这只喜鹊:
第一步& 打开Photoshop CS5, 界面如下:
第二步& 点击【文件】选择【打开】打开需要修改的照片.:
打开照片如下:
第三步& 用选择工具选中照片中的喜鹊(这里用【套索】工具):
在CS5 工作界面左侧的工具栏上点击【套索】工具.
用【套索】工具沿喜鹊周围划线(闭合的),选中喜鹊:
第四步& (1)& 点击【菜单】栏的【编辑】选项.
(2)& 在下拉菜单中选择【填充】.
在下拉菜单子菜单中选择【内容识别】,设置:【模式】为正常;【不透明度】为100%;点击【确定】
然后&请你耐心等候十数秒时间,让计算机去计算要填充的内容吧:
第五步& 哈!照片中的这只喜鹊轻松地去掉啦!背景也填充好啦!很容易吧!奥,对了,地面上还留有喜鹊的影子!:
第六步& 用上面同样的方法(如:第三步)将喜鹊的影子选中:
第七步& 再用同样的方法(如:第四步)将喜鹊的影子去掉:
这样就Ok啦:
最后效果:
附:照片处理效果两例
图例1. 旅游照片
&原片: (按下快门的瞬间闯入了不速之客,喧宾夺主啦
用CS5 &智能填充功能&【内容识别】选项处理后:
图例2 .风景片
这张照片中有两个多余的人物:
经过CS5 &智能填充功能&【内容识别】选项处理后:
试试再把图中这颗大树去掉:
大树面积较大,填充效果不够真实:
二.使用&智能填充功能&之&& 【污点修复画笔】工具,去掉照片中多余的景物的方法
【污点修复画笔】工具的使用极为简单,只需用【污点修复画笔】在需要修复的景物上涂抹、覆盖,即可自动清除画面上的&多余的景物&并自动填充好背景。
【污点修复画笔】工具适用于清除线形的景物,如树枝、电线、绳索、水管、杂草&&等,用【污点修复画笔】&一抹&即好,简单便捷。
在下面这张照片中,树枝较杂乱,且树枝挡在石榴前面,适当去除一些树枝,让画面减少杂乱感。
原图:&&&&&
第一步 在 Photoshop CS5中打开照片,例如先去除这个树枝:
第二步 在工具箱中选择【污点修复画笔】,设置好合适的像素,使笔触的大小可以覆盖需要涂抹的部位&
第三步用【污点修复画笔】在树枝上涂抹,笔划要完全覆盖好树枝:
用【污点修复画笔】工具涂抹后,树枝会自动消失,并且背景也会自动填充好。好啦,这个树枝去除了,很便捷吧!:
把认为不需要的部分都可以用上述方法去掉,最后效果:
附:照片处理效果(这里借助网友一张截图,在此表示感谢,如有异议即刻删除)
采用上述方法,用【污点修复画笔】工具在电线上涂抹,很便捷地去掉这些电线,最后效果:
三. 使用&智能填充功能&修复&自由变换&后的空角
我们有时会遇到拍摄的照片出现水平线倾斜的情况,用&自由变换&方法修整后,会给照片四角留下空白的现象,使用&智能填充功能&可以方便地进行修复
在这张打开的照片中,地平线倾斜显出长城的烽火台倾斜,照片缺乏稳定感,下方有影响美观的热水器,处理方法通常要进行旋转和裁剪:
用&自由变换&工具调整水平线:
&自由变换&调整之后,在照片的四角留下空白:
处理方法:(可以使用前述任意两种方法之一)
方法1.& 用【内容识别】工具修复,(如照片的右上角部分)可以用【矩形选框】工具选中空白角:
选【编辑】/【填充】/【内容识别】;如照片的右上角,修复完成:
方法2. 也可以使用【污点修复画笔】工具修复,(如照片的左上角):
依旧选:【编辑】/【填充】/【内容识别】;照片的左上角也修复完成:
依照同样方法修复照片下方的两处空白,载剪掉照片下部的杂物后最后效果:
原文地址:/pc/.html
关于 软件问题 的更多文章
一键ghost怎么用? 由于电脑病毒或系统不稳定等原因,系统在使用一段时间后,很多人都会重新...怎样用美图秀秀剪切出1寸的相片
怎样用美图秀秀剪切出1寸的相片
打开美图秀秀在右上角
从右面数第五个 有一个裁剪
美图秀秀是一款很好用的免费图片处理软件,不用学习就会用,比PS简单100倍!美图秀秀独有的图片特效、美容、饰品、边框、场景、拼图等功能,加上每天更新的精选素材,可以让你1分钟做出影楼级照片!美图秀秀还能做非主流图片、闪图、QQ表情、QQ头像……已有5000万人正在使用美图秀秀,你还没安装吗?赶快下载试试吧!