一丶#图形的处理
计算机表示图形资源的方式。
.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 loadp_w_picpath(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界面用户不可见。资源就会被回收。


##照相机