多媒体:文字、图片、音频、视频
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);