Android开发之基础----------多媒体图片加载、拍照和摄像(一)

多媒体:文字、图片、音频、视频

1.图片大小 = 图片的总像素 * 每个像素占用的大小    

图像格式:

* 单色图:每个像素占用1/8个字节

* 16色图:每个像素占用1/2个字节
* 256色图:每个像素占用1个字节
* 24位图:每个像素占用3个字节

Android系统以ARGB表示每个像素,所以每个像素占用4个字节,很容易内存溢出,所以需要对图片进行缩放。

图片缩放加载步骤:

1.获取屏幕尺寸。宽高

Display dp = getWindowManager().getDefaultDisplay();
    	int screenWidth = dp.getWidth();
    	int screenHeight = dp.getHeight();
2.获取图片宽高,

<span style="white-space:pre">	</span>Options opts = new Options();
	//请求图片属性但不申请内存
    	opts.inJustDecodeBounds = true;
<span style="white-space:pre">	</span>//加载图片资源
    	BitmapFactory.decodeFile("sdcard/dog.jpg", opts);
    	int imageWidth = opts.outWidth;
    	int imageHeight = opts.outHeight;
3.图片的宽高除以屏幕宽高,算出宽和高的缩放比例,取较大值作为图片的缩放比例

<span style="white-space:pre">	</span>int scale = 1;
    	int scaleX = imageWidth / screenWidth;
    	int scaleY = imageHeight / screenHeight;
    	if(scaleX >= scaleY && scaleX > 1){
    		scale = scaleX;
    	}
    	else if(scaleY > scaleX && scaleY > 1){
    		scale = scaleY;
    	}
4.按照缩放比例加载图片

//设置缩放比例
		opts.inSampleSize = scale;
		//为图片申请内存
    	opts.inJustDecodeBounds = false;
    	Bitmap bm = BitmapFactory.decodeFile("sdcard/dog.jpg", opts);
    	iv.setImageBitmap(bm);
如果需要对加载的图片进行编辑,那么就需要在内存中创建一个已经加载图片的副本,因为直接加载的Bitmap对象是只读的,不允许修改,

**********创建副本:

//加载原图
	Bitmap srcBm = BitmapFactory.decodeFile("sdcard/photo3.jpg");
        iv_src.setImageBitmap(srcBm);
        //创建与原图大小一致的空白bitmap
        Bitmap copyBm = Bitmap.createBitmap(srcBm.getWidth(), srcBm.getHeight(), srcBm.getConfig());
        //定义画笔
        Paint paint = new Paint();
        //把纸铺在画版上
        Canvas canvas = new Canvas(copyBm);
        //把srcBm的内容绘制在copyBm上
        canvas.drawBitmap(srcBm, new Matrix(), paint);
        iv_copy.setImageBitmap(copyBm);
***************图片的特效处理以及画板在下一个博客中总结。

保存图片到sdcard:

FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(new File("sdcard/dazuo.png"));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//保存图片
    	copyBm.compress(CompressFormat.PNG, 100, fos);
把保存到sdcard中的图片更新到图库中:

系统每次收到sdcard准备就绪广播时,就会去遍历sdcard中的文件和文件夹,把遍历到的所有多媒体文件在MediaStore数据库中保存一个索引,该索引

包括多媒体文件的文件名、大小,路径。

图库每次打开时并不会去遍历sdcard获取图片,而是通过内容提供者从MediaStore数据库中获取图片的信息,然后读取该图片。

系统开机或者点击加载sdcard按钮,就会发送sdcard就绪广播,我们也可以手动发送就绪广播。代码如下:

<span style="white-space:pre">	</span>Intent intent = new Intent();
    	intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
    	intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
    	sendBroadcast(intent);
***********拍照

启动系统提供的拍照程序

//隐式启动系统提供的拍照Activity
	Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
	//设置照片的保存路径
        File file = new File(Environment.getExternalStorageDirectory(), "haha.jpg"); 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
        startActivityForResult(intent, 0);
*****************摄像************

启动系统的摄像程序

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        File file = new File(Environment.getExternalStorageDirectory(), "haha.3gp"); 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
	//设置保存视频文件的质量
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(intent, 0);









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值