Android图片处理(入门)

作者: 啸天AskSky | 来源:发表于2016-11-04 15:48 被阅读962次

    概述

    图片格式概述:

    • BMP:高质量绘图 保证原图质量,用于相机等
      BMP格式图片是有一个一个的像素点组成,每一个像素都是一个颜色.而每一个像素显示的颜色用的二进制位也不相同,这个像素位称之为位深,位深越大,表示每一个像素点所用的二进制位越多,显示的图像也就越清晰。
      png:较高质量绘图 体积小,适用于网络传输
      png图片是将bmp图片进行压缩,其压缩格式类似于rar压缩——将相同的byte信息合并表示。png图片可以还原,是无损的压缩方式。
      jpg:良好的绘图质量 体积小,便于传输
      jpg格式图片也是对bmp图片进行压缩,因为眼睛的精度是有限的,jpg利用这一点将很多颜色相近的用同一颜色标识,而对于一大块相同的颜色,则用一个值表示。jpg格式图片不能被还原。

    根据图片信息计算图片大小:
    (像素长 * 像素宽 * 位深) / 8
    普通颜色值是用rgb格式表示一个色值,但是Android中表示色值则使用argb,即多了一个透明度,因此,在计算的时候,若计算机中位深为24,则Android中位深为32

    加载大图

    /**
     * 将图像加载到内存中
     *     Android为此操作提供了多种输入源:
     * `BitmapFactory.decodeByteArray(data, offset, length);
     *  BitmapFactory.decodeFile(pathName);
     *  BitmapFactory.decodeFile(pathName, opts);
     *  BitmapFactory.decodeStream(is);
     *  等方法,可以根据图片源所在的位置不同使用不同的方法进行加载
     * */
    Bitmap bm = BitmapFactory.decodeFile("mnt/sdcard/1.jpg");
    //将内存中的图像显示在ImageView控件上
    iv.setImageBitmap(bm);
    

    但是上述方法只适合加载比较小的图片,真正加载一张高清大图的时候就会出现内存溢出,解决方案如下:

    ImageView iv = (ImageView) findViewById(R.id.iv);
    /**
     *  在Android中,每一个应用程序所占用的内存空间大小都会有一个固定的大小限制
     *  假设此处加载的图片是2560*1440像素,图片位深是24的jpg格式图像
     *  虽然此图占用的磁盘空间是1.3M,但图片在加载到内存中时,实际上会先转换成位图图像
     *  那么这张图片加载到内存中的大小就是2560*1440*32(位深24,windows系统中,使用24位字节表示一个颜色值:#000000,
     *  但在Android中,每一个颜色值是用32位字节表示一个颜色值:#00000000),因此,这张图片加载到内存中所需要占用的内存
     *  大小约为:14M,因此,占用内存是极大的.若是直接将图片加载到内存中,容易造成内存溢出
     *  解决方案:按比例压缩图片
     *按比例压缩图片首先就是要获取图片的大小
     * */
    String path = "mnt/sdcard/1.jpg";
    //用于设置图片渲染器参数
    
    BitmapFactory.Options options = new Options();
    //设置图片加载属性:不加载图片内容,只获取图片信息
    options.inJustDecodeBounds = true;
    //加载图片信息
    BitmapFactory.decodeFile(path,options);
    //获取图片宽高
    int picwidth = options.outWidth;
    int picheight = options.outHeight;
    //获取屏幕大小
    //获取窗口管理器
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);   
    //获取默认显示设备
    Display dis =wm.getDefaultDisplay();
    //获取屏幕宽高
    //dis.getSize(outSize);此方法适用于新版本Android系统
    int diswidth = dis.getWidth();
    int disheight = dis.getHeight();
    //计算压缩比
    int wr = picwidth/diswidth;
    int hr = picheight/disheight;
    int  r = 1;
    if(wr>hr && wr>1){
      r = wr;
    }
    if(hr>wr && hr>1){
      r = hr;
    }
    //压缩图片
    options.inSampleSize = r;//设置压缩比
    options.inJustDecodeBounds = false;//设置加载图片内容
    Bitmap bm = BitmapFactory.decodeFile(path,options);
    iv.setImageBitmap(bm);
    

    复制图像

    ImageView iv = (ImageView) findViewById(R.id.iv);
    /**
     *  复制图片:作用
     *  在Android中,直接从资源文件加载到的图片是不能进行操作的,只能进行显示
     *  想要进行操作,可以复制一张图片到内存,然后操作复制到的图片
     * */
    //加载原图
    Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/1.jpg");
    //搞一个一样大小一样样式的复制图
    Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
    //获取复制图的画布
    Canvas canvas = new Canvas(copybm);
    //获取一个画笔,设置颜色
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    //向画布绘制,绘制原图内容
    canvas.drawBitmap(bitmap, new Matrix(), paint);
    //canvas.drawPoint(10, 10, paint); 向指定位置画一个点
    iv.setImageBitmap(copybm);
    

    图片旋转

    ImageView iv = (ImageView) findViewById(R.id.iv);
    /**
     *     图片旋转:
     *Android中原图是不能进行操作的,必须要先复制一张图到内存,然后再操作
     *旋转是在绘制过程中进行的
     * */
    //加载原图
    Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/1.jpg");
    //搞一个一样大小一样样式的复制图
    Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
    //获取复制图的画布
    Canvas canvas = new Canvas(copybm);
    //获取一个画笔,设置颜色
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    //设置图片绘制角度——设置矩阵
    Matrix matrix = new Matrix();
         /**       
    matrix.setValues(new float[]{//这是矩阵的默认值
    1.5f,0,0,
    0,1,0,
    0,0,1
    });
    而旋转其实是将每个点坐标和sinx  cosx进行计算...
        */
    //安卓提供了便捷方法
    matrix.setRotate(30,bitmap.getWidth()/2,bitmap.getHeight()/2);
    //向画布绘制,绘制原图内容
    canvas.drawBitmap(bitmap, matrix, paint);
    //canvas.drawPoint(10, 10, paint); 向指定位置画一个点
    iv.setImageBitmap(copybm);
    

    改变图片大小和位置

    ImageView iv = (ImageView) findViewById(R.id.iv);
    //加载原图
    Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/1.jpg");
    //搞一个一样大小一样样式的复制图
    Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
    //获取复制图的画布
    Canvas canvas = new Canvas(copybm);
    //获取一个画笔,设置颜色
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    //设置图片绘制角度——设置矩阵
    Matrix matrix = new Matrix();         
    matrix.setValues(new float[]{//这是矩阵的默认值
    1,0,0,
    0,1,0,
    0,0,1
    });
    /**
    位置矩阵计算公式(以默认值为例,计算x、y、z轴的值):
    x = 1x+0y+0z;
    y = 0x+1y+0z;
    z = 0x+0y+1z;
    通过改变矩阵值可以修改图片
    //图像的缩放也可以使用Android中自带的方法进行设置
    matrix.setScale(0.5f, 0.5f);
        */
    //向画布绘制,绘制原图内容
    canvas.drawBitmap(bitmap, matrix, paint);
    iv.setImageBitmap(copybm);
    

    镜像

    Matrix matrix = new Matrix();         
    matrix.setValues(new float[]{//这是矩阵的默认值
    -1,0,0,
    0,1,0,
    0,0,1
    });
    //镜像完还要平移回来
    matrix.postTranslate(bitmap.getWidth(), 0);
    //向画布绘制,绘制原图内容
    canvas.drawBitmap(bitmap, matrix, paint);
    

    倒影

    Matrix matrix = new Matrix();         
    matrix.setValues(new float[]{//这是矩阵的默认值
    1,0,0,
    0,-1,0,
    0,0,1
    });
    //镜像完还要平移回来
    matrix.postTranslate(0, bitmap.getHeight());
    //向画布绘制,绘制原图内容
    canvas.drawBitmap(bitmap, matrix, paint);
    iv.setImageBitmap(copybm);
    

    颜色处理

    //加载原图
    Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/1.jpg");
    //搞一个一样大小一样样式的复制图
    Bitmap copybm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
    //获取复制图的画布
    Canvas canvas = new Canvas(copybm);
    //获取一个画笔,设置颜色
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    ColorMatrix cm = new ColorMatrix();
    cm.set(//默认颜色矩阵,通过修改rgba来对图片颜色进行处理
    new float[]{
    1,0,0,0,0,
    0,1,0,0,0,
    0,0,1,0,0,
    0,0,0,1,0,
    }
    );
    /*
    颜色矩阵计算公式:
    red   = 1*128 + 0*128 + 0*128 + 0*0 +0
    blue  = 0*128 + 1*128 + 0*128 + 0*0 +0
    green = 0*128 + 0*128 + 1*128 + 0*0 +0
    alpha = 0*128 + 0*128 + 0*128 + 1*0 +0  透明度
    */
    paint.setColorFilter(new ColorMatrixColorFilter(cm));
    canvas.drawBitmap(bitmap,new Matrix(), paint);
    iv.setImageBitmap(copybm);
    

    相关链接:
    图片处理(进阶)

    如以上内容有任何错误或补充,欢迎加QQ:1195211669 ,验证信息:简书

    相关文章

      网友评论

        本文标题:Android图片处理(入门)

        本文链接:https://www.haomeiwen.com/subject/rxhwuttx.html