Android在程序中启动拍照/摄像或选择一张图片/视频,并制作缩略图后保存

有时候我们需要选择一个图片来做头像或是上传到相册中,这时候我们可以选择启动相机拍照,或者从图库中选择。

首先看看如何启动相机拍照并取得所拍的照片。

下面是启动相机拍照并返回所拍的照片的代码:

1 public void capturePicture(){
2     //启动拍照,并保存到临时文件
3     Intent intent = new Intent();
4     intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
5     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
6     startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);
7 }

下面是启动相机摄像并返回所拍的录像的代码:

1 public void captureVideo(){
2     Intent intent2 = new Intent();
3     intent2.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
4     intent2.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); //设置为低质量
5     startActivityForResult(intent2, REQUEST_CAPTURE_VIDEO);
6 }

下面是打开图库(既系统默认的图片选择器),选择一个图片或视频的代码:

1 public void choosePicture(){
2     Intent intent3 = new Intent();
3     intent3.setType("image/*");
4     intent3.setAction(Intent.ACTION_GET_CONTENT);
5     startActivityForResult(intent3, REQUEST_CHOOSE);
6 }

这样子整个过程就完成了,拍完照后我们按“确定”健,或者点击选择了照片后,返回到了我们程序的界面,那如何取得刚才的照片呢?请注意上面的代码中使用了startActivityForResult方法,所以很明显我们需要重载onActivityResult方法来拿到返回的数据。代码如下:

 1         @Override
 2            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 3                super.onActivityResult(requestCode, resultCode, data);
 4 
 5                switch(resultCode){
 6                     case RESULT_OK:    
 7                         Uri uri = data.getData(); // 得到Uri
 8                                  String fPath = uri2filePath(uri); // 转化为路径
 9                             /* 做你想做的处理 **/
10                             break;
11                 }
12          }

整个过程到此完成。

 

下面附上制作缩略图和把Uri转化为文件路径的方法!
制作图片或视频的缩略图:

 1         /** 创建缩略图,返回缩略图文件路径 */
 2     public String createThumbnail(Bitmap source, String fileName){
 3         int oldW = source.getWidth();
 4         int oldH = source.getHeight();
 5         
 6         int w = Math.round((float)oldW/MAX_SIZES);  //MAX_SIZE为缩略图最大尺寸
 7         int h = Math.round((float)oldH/MAX_SIZES);
 8         
 9         int newW = 0;
10         int newH = 0;
11         
12         if(w <= 1 && h <= 1){
13             return saveBitmap(source, fileName);
14         }
15         
16         int i = w > h ? w : h;  //获取缩放比例
17         
18         newW = oldW/i;
19         newH = oldH/i;
20         
21         Bitmap imgThumb = ThumbnailUtils.extractThumbnail(source, newW, newH);  //关键代码!!
22         
23         return saveBitmap(imgThumb, fileName);  //注:saveBitmap方法为保存图片并返回路径的private方法
24     }
25     
26     /** 创建视频缩略图,返回缩略图文件路径 */
27     public String createVideoThumbnail(String filePath, String fileName){
28         Bitmap videoThumb = ThumbnailUtils.createVideoThumbnail(filePath, Thumbnails.MINI_KIND);  //关键代码!!
29         return saveBitmap(videoThumb, fileName);  //注:saveBitmap方法为保存图片并返回路径的private方法
30 
31     }

把Uri转化为文件路径:

1         /** 把Uri转化成文件路径 */
2     private String uri2filePath(Uri uri){
3         String[] proj = { MediaStore.Images.Media.DATA };
4         Cursor cursor = managedQuery(uri,proj,null,null,null);
5         int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
6         cursor.moveToFirst();
7         String path = cursor.getString(index);
8         retur

拍摄的视频第一帧 并且返回图片

	/**
	 * 获取网络视频 第一帧 createVideoThumbnail
	 * @param filePath 播放地址
	 * @param kind 帧数 传 MediaStore.Images.Thumbnails.MINI_KIND
	 * @return
	 */
	public static Bitmap createVideoThumbnail(String filePath, int kind)
	{
		Bitmap bitmap = null;
		MediaMetadataRetriever retriever = new MediaMetadataRetriever();
		try
		{
			if (filePath.startsWith("http://")
					|| filePath.startsWith("https://")
					|| filePath.startsWith("widevine://"))
			{
				retriever.setDataSource(filePath, new Hashtable());
			}
			else
			{
				retriever.setDataSource(filePath);
			}
			bitmap = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); //retriever.getFrameAtTime(-1);
		}
		catch (IllegalArgumentException ex)
		{
			// Assume this is a corrupt video file
			ex.printStackTrace();
		}
		catch (RuntimeException ex)
		{
			// Assume this is a corrupt video file.
			ex.printStackTrace();
		}
		finally
		{
			try
			{
				retriever.release();
			}
			catch (RuntimeException ex)
			{
				// Ignore failures while cleaning up.
				ex.printStackTrace();
			}
		}

		if (bitmap == null)
		{
			return null;
		}

		if (kind == MediaStore.Images.Thumbnails.MINI_KIND)
		{//压缩图片 开始处
			// Scale down the bitmap if it's too large.
			int width = bitmap.getWidth();
			int height = bitmap.getHeight();
			int max = Math.max(width, height);
			if (max > 512)
			{
				float scale = 512f / max;
				int w = Math.round(scale * width);
				int h = Math.round(scale * height);
				bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);
			}//压缩图片 结束处
		}
		else if (kind == MediaStore.Images.Thumbnails.MICRO_KIND)
		{
			bitmap = ThumbnailUtils.extractThumbnail(bitmap,
					96,
					96,
					ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
		}
		return bitmap;
	}


来源:http://blog.csdn.net/assassin4824/article/details/7767248

你可能感兴趣的:(Android-视频图片操作)