笔记111--调用相机并裁剪,从相册截图。及原理分析

一、调用相机拍照
1、启动相机

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_PHOTO_WITH_DATA);

2、在onActivityResult中获取返回数据

Bitmap photo = data.getParcelableExtra("data");

二、裁剪处理

调用时机:启动相机拍完照后,再调用裁剪处理。

 Intent intent = new Intent("com.android.camera.action.CROP");
 intent.setType("image/*");
 intent.putExtra("data", data);
 intent.putExtra("crop", "true");
 intent.putExtra("aspectX", 1);
 intent.putExtra("aspectY", 1);
 intent.putExtra("outputX", 128);
 intent.putExtra("outputY", 128);
 intent.putExtra("return-data", true);
 startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);

三、调用相机返回原图

调用相机拍照返回的是拍照生成的缩略图,如果要获取原图,还需要一番折腾。其原理是:启动相机拍照后,将图片保存在指定路径,然后再onActivityResult()中再获取图片即可。

当然了,需要验证手机是否有SD卡~~

<pre name="code" class="java">public void onClick(View v) { 
	//先验证手机是否有sdcard 
	String status=Environment.getExternalStorageState(); 
	if(status.equals(Environment.MEDIA_MOUNTED)) { 
		try { 
			File dir=new File(Environment.getExternalStorageDirectory() + "/"+localTempImgDir); 
			if(!dir.exists())dir.mkdirs(); 

			Intent intent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
			File f=new File(dir, localTempImgFileName);//localTempImgDir和localTempImageFileName是自己定义的名字 
			Uri u=Uri.fromFile(f); 
			intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0); 
			intent.putExtra(MediaStore.EXTRA_OUTPUT, u); 
			startActivityForResult(intent, GET_IMAGE_VIA_CAMERA); 
		} catch (ActivityNotFoundException  e) { 
			Toast.makeText(ImpromptuActivity.this, "没有找到储存目录",Toast.LENGTH_LONG).show();  
		} 
	}else{ 
		Toast.makeText(ImpromptuActivity.this, "没有储存卡",Toast.LENGTH_LONG).show(); 
	} 
}<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
 onActivityResult()中: 

@Override   
protected void onActivityResult(int requestCode, int resultCode, Intent data) {   
	if(resultCode==RESULT_OK ) {   
        switch(requestCode) {   
        case GET_IMAGE_VIA_CAMERA:   
            File f=new File(Environment.getExternalStorageDirectory() +"/"+localTempImgDir+"/"+localTempImgFileName);   
            try {   
                Uri u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(),   
                f.getAbsolutePath(), null, null));   
                //u就是拍摄获得的原始图片的uri,剩下的你想干神马坏事请便……   
            } catch (FileNotFoundException e) {   
                e.printStackTrace();   
            }   
            break;   
        }   
	}   
	super.onActivityResult(requestCode, resultCode, data);   
}
大头戏来了

转自:http://www.cnblogs.com/jun-it/articles/2881826.html#commentform

一、裁剪图片的Intent附件参数的具体意义


看下三个极为重要的选项:data、MediaStore.EXTRA_OUTPUT以及return-data。

二、原理介绍。

data和MediaStore.EXTRA_OUTPUT都是可选的传入数据选项,你可以设置data为Bitmap,或者将相应的数据与URI关联起来,你也可选择是否返回数据(return-data)。

常见用法:

1)使用Bitmap并返还数据。return-data设为true,你将获得一个与内部数据关联的action,并且bitmap以此方法返回:extras.getParcelabel("data")。如果你最终要获取的图片比较大,那么不建议用此方法。

Bundle myExtras = getIntent().getExtras();
if (myExtras != null && (myExtras.getParcelable("data") != null || myExtras.getBoolean("return-data")))
{
    Bundle extras = new Bundle();
    extras.putParcelable("data", croppedImage);
    setResult(RESULT_OK,(new Intent()).setAction("inline-data").putExtras(extras));
    finish();
}
2)使用URI返回数据。return-data为false,那么在onActivityResult()中你将不会接收到任何Bitmap,你需要将MediaStore.EXTRA_OUTPUT关联到一个Uri,此Uri是用来存放Bitmap的。但是有些条件,首先你需要一个短暂的与此uri相关联的文件地址,当然这不是个大问题(除非是那些没有sdcard的设备)。
if (mSaveUri != null) {
    OutputStream outputStream = null;
    try {
        outputStream = mContentResolver.openOutputStream(mSaveUri);
        if (outputStream != null) {
            croppedImage.compress(mOutputFormat, 75, outputStream);
        }
    } catch (IOException ex) {
        // TODO: report error to caller
        Log.e(TAG, "Cannot open file: " + mSaveUri, ex);
    } finally {
        Util.closeSilently(outputStream);
    }
    Bundle extras = new Bundle();
    setResult(RESULT_OK, new Intent(mSaveUri.toString()).putExtras(extras));
}
简而言之,截大图用URI,小图用Bitmap。

三、相册截图
1、从相册截大图

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 600);
intent.putExtra("outputY", 300);
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", true); // no face detection
startActivityForResult(intent, CHOOSE_BIG_PICTURE);

2、从相册截小图
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 100);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, CHOOSE_SMALL_PICTURE);
3、onActivityResult()处理返回的数据

switch (requestCode) {
case CHOOSE_BIG_PICTURE:
 Log.d(TAG, "CHOOSE_BIG_PICTURE: data = " + data);//it seems to be null
 if(imageUri != null){
  Bitmap bitmap = decodeUriAsBitmap(imageUri);//decode bitmap
  imageView.setImageBitmap(bitmap);
 }
 break;
case CHOOSE_SMALL_PICTURE:
 if(data != null){
  Bitmap bitmap = data.getParcelableExtra("data");
  imageView.setImageBitmap(bitmap);
 }else{
  Log.e(TAG, "CHOOSE_SMALL_PICTURE: data = " + data);
 }
 break;
default:
 break;
}

 

private Bitmap decodeUriAsBitmap(Uri uri){
 Bitmap bitmap = null;
 try {
  bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
 } catch (FileNotFoundException e) {
  e.printStackTrace();
  return null;
 }
 return bitmap;
}

四、拍照截图

1、





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、软件破解之前,先运行下载文件中的magicexif_setup_0813.exe安装软件 2、鼠标双击下载下来的安装程序。如果系统提示“无法验证发布者,您确定要运行此软件吗”请点“运行”按钮。 3、双击安装文件,进入安装程序欢迎页面,点击"next“开始安装,然后根据安装向导完成安装即可; 4、注意,软件安装完成之后,不要启动软件,因为这个破解方法不能在软件运行的情况下进行。将下载文件夹中的MagicEXIF.exe复制到软件的安装目录中替换同名文件 5、然后打开软件,可以看到,注册按钮是会社的,而且显示授权给旗舰版用户,无到期时间说明软件成功注册 软件特点: 1、强大的解码能力,看穿照片背后的一起隐藏信息 MagicEXIF 直接支持 EXIF2.3 和 TIFF6 标准,可从 JPEG/EXIF/TIFF/RAW 等多种文件格式中读取并编辑超过 1500 项 EXIF、GPS 数据,当中包括佳能、尼康、索尼、富士等内的16个常见的设备生产商的厂商注释项目。诸如快门次数、镜头参数、光圈档位,甚至是相机温度、转存次数等都能轻松查看和编辑 2、GPS数据可视化,照片地理信息一览无余 MagicEXIF 不仅可以读取和修改照片中的 GPS 地理数据,更能够通过内置的地图组件将 GPS 数据直接呈现在地图上。MagicEXIF 拥有强大的地图偏移修正功能,能够准确解密并修正 BD-09、GCJ-02 坐标系的偏移,真正实现精确定位。无论是探索自己或他人的旅行足迹,还是往照片中添加地理数据来归档照片、记录旅途,相信您总能找到属于自己的乐趣。对于航拍爱好者,您还可以使用 GPS 批量导入导出工具一次性把 GPS 数据导入到照片中或从照片中导出 3、一键清楚图像编辑历史,网络分享无忧,无惧隐私泄露 许多诸如 Adobe Photoshop 等图像编辑软件在转存图像后会自动插入大量其私有的元数据以方便图像编辑历史的管理,但实上用户往往并不需要、也察觉不到这些信息。MagicEXIF 可以智能识别出这些私有数据以及其他被修改的项目,并将其彻底清除,从而保护图像的原始性和用户隐私 4、高真度原厂编码引擎,从此不怕原始数据丢失或损坏 MagicEXIF 不仅可以重编码图像的EXIF数据,更能够使用一系列原创的JPEG编码器对图像进行转码操作,从而生成带有原始EXIF数据的JPEG图像。经过 MagicEXIF 重构的图像与原厂数码相机出片并无明显差异,由此用户可以恢复由于压缩或编辑而丢失的图像数据,从此再也不怕原始数据意外丢失或损坏。 5、全面中文和Unicode支持,记录图像的点点滴滴 MagicEXIF 直接支持中文GBK编码,甚至允许用户使用日文JIS编码和Unicode字符插入自定义用户注释,可插入的文字长度超过50kb,能够满足新闻工作者、专业摄影师等以及普通用户对于图像记录和图像归档的需求。 6、批量处理,修改图像属性就是这么轻松 MagicEXIF 允许用户对多个图像文件进行批量操作,可操作的范围涵盖所有标准甚至非标准EXIF、GPS以及其他项目。MagicEXIF 还允许用户使用动态时间,每完成处理一张图的拍摄时间后系统会为这个时间自动加上一个指定范围的值作为下一张图的拍摄时间,整个过程用户无需介入,省时省力 常见问题: 1、运行 MagicEXIF 元数据编辑器有什么要求? MagicEXIF 元数据编辑器运行所需的系统要求很低,在 Windows XP(或 Windows NT 5.1)以上系统上即可顺利安装与运行,并且同时支持 32 位和 64 位的操作系统。但是在 Windows XP 下,因受到系统应用程序接口限制,与 UTC 时间计算有关的功能将无法使用,因此我们推荐使用 Windows 7 以上的操作系统。 2、软件可用编辑 RAW 文件吗? 目前 MagicEXIF 元数据编辑器可以直接打开 RAW 文件并读取当中的 EXIF、XMP 等元数据。但是为了保证 RAW 文件在编辑后的可读性,软件目前并不直接支持 RAW 格式的保存。对于 RAW 文件中的元数据,我们推荐先转存为 EXIF 格式的模板文件,然后再导入到转码后的 TIFF 或 JPEG 图像格式中。 3、照片编辑后会改变底层的数据编码方式或丢失原始信息吗? 传统的图片处理软件(包括 Adobe Photoshop、ACDSee 等在内)或其他 EXIF 编辑器在编辑图像后只能够保证 EXIF 部分数据的可读性,因此使用这些软件编辑图像后往往会令厂商注释、XMP、MPF、压缩特征等非标准 EXIF 部分的数据损坏甚至完全丢失。而 MagicEXIF 元数据编辑器拥有自主研发的强大的编码器,在不改变照片原本编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值