`
大头K
  • 浏览: 186083 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

调用手机相机实现拍照、剪裁、保存图片到手机(含github源码地址)

阅读更多
调用手机相机实现拍照、剪裁图片、并保存图片到手机

先看效果图:





直接上代码:
package com.liucanwen.camerademotest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

/**
 * 拍照demo
 * 功能:拍照、剪裁、保存到手机上
 * @author ck
 * @since 2014年3月20日 16:04:57
 */
public class MainActivity extends Activity implements OnClickListener
{
	private ImageView headIv;

	// 设置头像
	private static final int IMAGE_REQUEST_CODE = 0; // 请求码 本地图片
	private static final int CAMERA_REQUEST_CODE = 1; // 拍照
	private static final int RESULT_REQUEST_CODE = 2; // 裁剪
	private static final String SAVE_AVATORNAME = "head.png";// 保存的图片名

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		headIv = (ImageView) findViewById(R.id.image_layout);
		headIv.setOnClickListener(this);
	}

	@Override
	public void onClick(View v)
	{
		switch (v.getId())
		{
		case R.id.image_layout:
			showOptionsDialog();
			break;

		default:
			break;
		}
	}

	// 选择图片来源
	private void showOptionsDialog()
	{
		String[] items = new String[] { "拍照", "选择本地图片" };
		
		DialogInterface.OnClickListener click = new DialogInterface.OnClickListener()
		{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				switch (which)
				{
				case 0://拍照
					Intent intentFromCapture = new Intent(
							MediaStore.ACTION_IMAGE_CAPTURE);
					intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri
							.fromFile(new File(Environment
									.getExternalStorageDirectory(),
									SAVE_AVATORNAME)));
					startActivityForResult(intentFromCapture,
							CAMERA_REQUEST_CODE);
					break;
				case 1://选择本地图片
					Intent intentFromGallery = new Intent();
					intentFromGallery.setType("image/*"); // 设置文件类型
					intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
					startActivityForResult(intentFromGallery,
							IMAGE_REQUEST_CODE);
					break;
				}
			}
		};
		
		new AlertDialog.Builder(this).setItems(items,
				click).show();
	}

	/**
	 * 回调结果处理
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		if (resultCode != RESULT_CANCELED)
		{
			switch (requestCode)
			{
			case IMAGE_REQUEST_CODE:
				startPhotoZoom(data.getData());
				break;
			case CAMERA_REQUEST_CODE:
				startPhotoZoom(Uri.fromFile(new File(Environment
						.getExternalStorageDirectory(), SAVE_AVATORNAME)));
				break;
			case RESULT_REQUEST_CODE:
				if (data != null)
				{
					getImageToView(data);
				}
				break;
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	/**
	 * 裁剪图片方法实现
	 */
	public void startPhotoZoom(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", 300);
		intent.putExtra("outputY", 300);
		intent.putExtra("return-data", true);
		startActivityForResult(intent, RESULT_REQUEST_CODE);
	}

	/**
	 * 保存裁剪之后的图片数据
	 */
	private void getImageToView(Intent data)
	{
		Bundle extras = data.getExtras();
		if (extras != null)
		{
			Bitmap photo = extras.getParcelable("data");
			saveMyBitmap(photo); // 保存裁剪后的图片到SD
			headIv.setImageBitmap(photo);
		}
	}

	/**
	 * 将头像保存在SDcard
	 */
	public void saveMyBitmap(Bitmap bitmap)
	{
		File f = new File(Environment.getExternalStorageDirectory(),
				SAVE_AVATORNAME);
		try
		{
			f.createNewFile();
			FileOutputStream fOut = new FileOutputStream(f);
			bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);

			fOut.flush();
			fOut.close();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}
}


github源码地址:
https://github.com/kk-java/CameraDemo
  • 大小: 60.9 KB
0
0
分享到:
评论

相关推荐

    Android调用Camera实现拍照--github地址

    这是github的项目源码地址。Android Studio2.3.3调用系统的Camera实现拍照功能,并将照片保存到本地内存卡中

    swift版的Github 源码

    Swift版的GitHub源码主要指的是使用Swift编程语言实现的GitHub客户端应用的源代码。相比于Objective-C(OC)版本,Swift的语法更加简洁明了,使得开发过程更为高效。以下将详细探讨Swift语言在构建GitHub客户端时所...

    GitHub Android App源码

    这款应用的源码是公开的,对于Android开发者而言,它是一个宝贵的资源,可以学习到GitHub客户端应用的实现细节,提升自己的Android开发技能。 1. **GitHub API的使用**: - GitHub App 使用GitHub的V3 REST API 和...

    最新php码云+github图床源码

    php码云+GitHub图床源码,依托码云和github,搭建一个免费的,受自己控制的图床。 既稳定,也不用担心对方跑路。可能目录模式对大图不友好,所以采用贴图+图片链接模式。 仅支持单文件,大小限制2MB,本站图床存储...

    SpringFramework3.2 源码 github源码gradle编译

    在标题中提到的“SpringFramework3.2 源码 github源码gradle编译”,意味着我们可以从GitHub获取到Spring Framework 3.2的源代码,并使用构建工具Gradle来编译和管理项目依赖。Gradle是一种强大的构建自动化工具,它...

    微信小程序范例-github源码.rar

    微信小程序-github  微信小程序的一个练手项目以及作为一个github重度使用者,使用[github api](https://developer.github.com/v3/)结合微信小程序来开发.使用方法  没有小程序的内测资格,自然也就无法上传,只能...

    Spark github源码 例子很有价值

    "Spark github源码 例子很有价值"这个标题表明,通过分析这些源码,我们可以学习到Spark如何实现其核心功能,如弹性分布式数据集(RDD)、DataFrame、Dataset以及Spark SQL等。 描述中提到"github无法下载的可以直接...

    Unity3d调用IOS相册,对照片进行剪裁

    - 在iOS原生代码中,实现UnitySendMessage方法,接收到Unity的调用后启动UIImagePickerController,处理用户的选择和剪裁操作。完成后,通过UnitySendMessage将处理好的图片数据传回Unity。 - 图片数据通常是Base...

    微信小程序demo:github博客(源代码+截图)

    微信小程序demo:github博客(源代码+截图)微信小程序demo:github博客(源代码+截图)微信小程序demo:github博客(源代码+截图)微信小程序demo:github博客(源代码+截图)微信小程序demo:github博客(源代码+截图)微信...

    珠峰vue源码,github转的

    此外,你还可以通过查看生命周期钩子函数了解组件从创建到销毁的过程,学习如何使用Vue Router实现路由导航,以及如何使用axios等库进行API调用。同时,这些源码可能包含了一些实战项目,让你有机会将理论知识应用到...

    cmder-github源码

    一款Windows环境下非常简洁美观易用的命令行工具——cmd替代者,它支持了大部分的Linux命令。支持ssh连接linux,使用起来非常方便。比起cmd、powershell、conEmu,其界面美观简洁,功能强大。

    github上Vue2.6源码

    在GitHub上,Vue的源码是公开的,这为开发者提供了一个深入了解框架工作原理、学习最佳实践以及贡献代码的机会。 源码学习通常涉及以下几个方面: 1. **设计模式**:Vue.js 使用了多种设计模式,如发布-订阅者模式...

    github copilot源码

    《GitHub Copilot 源码解析与应用探索》 GitHub Copilot 是一款革命性的代码辅助工具,由 GitHub 和 OpenAI 合作开发。它利用强大的机器学习算法,为程序员提供智能代码补全功能,极大地提高了编码效率。在本文中,...

    grpc的github资源源码下载脚本

    github源码下载速度慢,脚本使用了国内镜像下载路径,执行权限即可,全部源码会自动高速下载到grpc目录中。

    全景自动拼接源码Github资源

    全景自动拼接是一种将多张图像融合...总之,"全景自动拼接源码Github资源" 提供了一个实际操作的平台,让你能够动手实现全景图像的自动拼接,不仅加深了对OpenCV库的理解,还能提升在图像处理和计算机视觉领域的技能。

    Android项目源码Github的第三方客户端源码

    Github的第三方客户端源码,这是一个代码托管网站Github的移动客户端,基于Github 官方API开发,实现了查看动态,查看项目详情,查看代码,star项目,follow用户,搜索项目,搜索用户,查看Trending等主要功能。

    s7netplus-0.9.0github源码读写测试0811.rar

    标题中的“s7netplus-0.9.0github源码读写测试0811.rar”表明这是一个关于s7netplus项目的源码版本,版本号为0.9.0,且该源码可能来自于GitHub,同时进行了读写测试,日期可能是2022年8月11日。这个项目很可能涉及到...

    Github-volley jar包和源码

    volley是一个优秀的安卓开源网络访问工具 这里包含一个volley代码jar和源码,版本是2015.03.03的1.0.11版本 更多资料可以参见volley的github地址: https://github.com/mcxiaoke/android-volley

    GitHub上最火的40个Android开源项目源码

    GitHub上最火的40个Android开源项目源码,筛选了下,主要是把可以加到我们项目中的下了下来,这里有40个项目的描述,以及12个项目的源码,省的各位童鞋重复下载了,当然如果有童鞋需要其他的项目,我这里也给出了...

    Tengine-Kit的github源码

    TengineKit.Image类封装了一系列工具API,帮助开发者快速方便的处理图片相关的功能,具体功能请查阅文档,这里我们将用这个TengineKit.Image里面的API实现Android前置摄像头视频流转为Bitmap(YUV_NV21转RGBA)。

Global site tag (gtag.js) - Google Analytics