一丶#图形的处理
计算机表示图形资源的方式。
.png 高质量的图片,用于计算机和网络 (文件体积比较小)
>无损的图形压缩算法。
.jpg 良好质量的图片,用于计算机和网络 (文件体积也比较小)
>图形压缩算法,类似rar算法,眼睛精度有限,比较深的红色,稍微淡点红色。
>把相邻空间,类似的颜色同一用同一种颜色表示,降低图片的精度。
.bmp 高质量的图片,用于计算机(文件体积很大)
>表示图片中的每一个点(像素),一个像素一个颜色,一般bmp图形的一个像素点需要3个byte表示
##OOM(out of memory)
内存空间不足
Android一般每一个应用程序都是一个独立的进程,操作系统会给进程创建一个dalvik的虚拟机,虚拟机默认最大堆内存空间16MB,如果应用程序需要的空间大于16Mb 就会抛出oom的异常。
如何解决:
计算机显示图形,实际上显示的图形的每个像素点。
受计算机或者手机屏幕分辨率的限制,如果图片不放大,没法把所有的像素都显示到界面上的。
只是显示了图片的一个缩略图,加载的时候,就没有必要把全部的像素都加载到内存里面。
bitmap 表示的就是图形的每个像素点。 400*800 int[320000]
1. 判断手机的分辨率
2. 获取图片的分辨率
3. 根据比例进行缩放显示
例子:public void loadimage(View view) {
// 拿到屏幕的宽度和高度
// 拿到手机的系统管理器
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
// 拿到屏幕的宽度
Display display = wm.getDefaultDisplay();
int screenWidth = display.getWidth();
// 拿到屏幕的高度
int screenHeight = display.getHeight();
// 加载原始图片的大小
Options opts = new Options();
// 此句的含义就是让decodeFile方法不再返回图片本身,而只返回图片的参数信息
opts.inJustDecodeBounds = true;
// 不再返回图片的数据,而是返回图片的大小数据放到opts对象中
//BitmapFactory.decodeFile("/mnt/sdcard/zhaopian.JPG", opts);
BitmapFactory.decodeFile(path, opts);
// 拿到图片的本身大小
// 拿到图片的宽度
int picWidth = opts.outWidth;
// 拿到图片的高度
int picHeight = opts.outHeight;
// 按比例缩小图片
int wc = picWidth / screenWidth;
int hc = picHeight / screenHeight;
// 定义一个变量表示缩放比例
int scale = 1;
if (wc > hc && hc >= 1)
scale = wc;
if (hc > wc && wc >= 1)
scale = hc;
// 设置采样率
opts.inSampleSize = scale;
// 拿到缩放后的图片
// 此句必须设回为false,否则拿不到图片
opts.inJustDecodeBounds = false;
Bitmap copy = BitmapFactory
.decodeFile(path, opts);
iv.setImageBitmap(copy);
System.out.println(path);
}
##计算机图形处理的原理
>计算机表示图形,实际上表示的是图形的每一个像素点
>图形处理其实就是对文件的0011进行数据变化
##图形处理的常用API
>计算机修改图形,并不是直接修改图片的原图(文件),修改的原图在内存空间中的一个副本(拷贝)
* 旋转
matrix.setRotate(30, copyBitmap.getWidth()/2, copyBitmap.getHeight()/2);
* 平移
matrix.setTranslate(30, 50);
* 缩放
matrix.setScale(2.0f, 2.0f);
* 倒影
Matrix matrix = new Matrix();
matrix.setScale(1.0f, -1.0f);
//只有采用post才可以让位置 移动立刻生效
matrix.postTranslate(0, copyBitmap.getHeight());
* 镜面
matrix.setScale(-1.0f, 1.0f);
//只有采用post才可以让位置 移动立刻生效
matrix.postTranslate(copyBitmap.getWidth(), 0);
* 修改图形的颜色
ColorMatrix cm = new ColorMatrix();
cm.set(new float[] {
1, 0, 0, 0, 0, //red
0, 2, 0, 0, 0, //green
0, 0, 1, 0, 0, //blue
0, 0, 0, 1, 0 //透明度
});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
例:附件里面的(简单的美图秀秀和画图工具)
##音频处理
MediaPlayer
* 同步的准备(阻塞,准备的等待操作在主线程,本地资源播放)
* 异步的准备(非阻塞,准备的等待操作在子线程,网络资源播放)
##视频处理
SurfaceView 表面视图
可以在别的线程修改更新UI
双缓冲概念:两个线程共同作用
适合视频播放,适合游戏界面的渲染
SurfaceView重量级控件, 内存开销比较大,cpu开销比较大,
双缓冲切换器创建好了
只有SurfaceView界面用户可见了。才可以执行逻辑。
如果SurfaceView界面用户不可见。资源就会被回收。
##照相机
本文出自 “android笔记” 博客,请务必保留此出处http://2585211.blog.51cto.com/10044233/1671804
原文地址:http://2585211.blog.51cto.com/10044233/1671804