Android开发笔记之多媒体图像的处理

一.图像的两种分类
位图:也被称为点阵图像或者绘制图像,是由像素的一系列单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,从而使得线条和形状显得参差不齐。
矢量图:也被称为面向对象的图像或绘图图像,在数学上定义为一系列由先连接的点。也就是常说的数学函数的轨迹。

二.图像的加载
1.普通图片加载到内存
先将一张小图片拷贝到内存卡中,布局就一个ImageView和Button,点击Button加载出图像。
Button的点击事件:

public void loadImage(View view){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
 String path=Environment.getExternalStorageDirectory()+"/img_small_1.jpg";
 Bitmap bitmap =BitmapFactory.decodeFile(path);
 iv.setImageBitmap(bitmag);
    }
}

2.大图片加载
如今的图片像素往往比手机屏幕还要大,若是将大图片显示到这样的手机屏幕上容易内存溢出(以前),而且还不能完美的展示图片的精度。这里涉及到一个加载大图片需要用到的“采样率”。
我们需要先获取当前设备的屏幕信息,再获取需要加载的图片的大小,计算出采样率,加载图片。

    public void loadImage(View view){
        if(Environment.getExternalStorageState()
                .equals(Environment.MEDIA_MOUNTED)){
            String path=Environment.getExternalStorageDirectory()+"/img_big_1.jpg";
            Options options=new Options();
            //设置图片的采样率
            //获取屏幕的宽高
            WindowManager windowManager=(WindowManager) getSystemService(WINDOW_SERVICE);
//          int screenwidth=windowManager.getDefaultDisplay().getWidth();
//          int screenheigh=windowManager.getDefaultDisplay().getHeight();
            Display display=windowManager.getDefaultDisplay();
            Point point=new Point();
            display.getSize(point);
            int screenWidth=point.x;
            int screenHeigh=point.y;
            System.out.println(screenWidth);
            System.out.println(screenHeigh);


            //获取原图的宽高
            try {
                ExifInterface exifInterface=new ExifInterface(path);
                int imageWidth=exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0);
                int imageHeigth=exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0);
                int sampleWidth=(int)(imageWidth*1.0f/screenWidth+0.5f);//加0.5就是为了四舍五入
                int sampleHeight=(int)(imageHeigth*1.0f/screenHeigh+0.5f);

                int sample=(int)(Math.sqrt(sampleWidth*sampleWidth+sampleHeight*sampleHeight)+0.5f);//采样率公式

                options.inSampleSize=sample;//原宽*1/4,原长*1/4
                Bitmap bitmap=BitmapFactory.decodeFile(path,options);
                iv.setImageBitmap(bitmap);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            options.inSampleSize=2;//原宽*1/4,原长*1/4

        }
    }

三.图像的操作处理
首先先讲一下如何画出和原来图像一模一样的图片:

private ImageView iv;

    //图纸
    private Bitmap baseBitmap,copyBitmap;

    //画板
    private Canvas canvas;

    //画笔
    private Paint paint;
    public void btn(View view){
        //拿到原图
        baseBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.img_small_1);
        //先拿到一张与原图大小一样的纸
    copyBitmap=Bitmap.createBitmap(baseBitmap.getWidth(),baseBitmap.getHeight(),baseBitmap.getConfig());
        //将这张纸固定在画板上
        canvas=new Canvas(copyBitmap);
        //找画笔
        paint=new Paint();
        //按照一定规则处理图片
        Matrix matrix=new Matrix();//1:1缩放
        matrix.setScale(0.5f, 1.0f);//宽和长不同缩放设置
        matrix.setTranslate(100f, 50f);//平移操作设置
        canvas.drawBitmap(baseBitmap, matrix, paint);参数分别表示参照图片,处理效果,画笔
        //放到组件上
        iv.setImageBitmap(copyBitmap);

在Android中对图像进行处理,那么一定用到Matrix这个类。Matrix对图像的处理可分为五种基本变换。
1.图像的缩放处理

matrix.setScale(0.5f, 1.0f);

2.图像的位移处理

matrix.setTranslate(100f, 50f);//图片在画板中移动,原点是左上角,整数表示往右和下方移动

3.图像的旋转处理

1.matrix.setRotate(-45);//顺时针旋转多少度,圆点是左上角,若是要逆时针旋转,角度设置成负数
        2.matrix.setRotate(45,baseBitmap.getWidth()/2,baseBitmap.getHeight()/2);//设置以某个圆点顺时针(正数表示顺时针方向)旋转,后边两个参数分别表示x坐标和y坐标

4.图像的镜面处理

matrix.setScale(-1f,1f);//缩放处理,翻转,往左翻了了个(即把宽翻了个个),翻转后图片在画布的左方,需要再次进行平移操作
matrix.postTranslate(baseBitmap.getWidth(),0);//如果要对图片进行多次操作,那么要用postxxx方法,不能直接用setxxx方法追加

5.图像的倒影处理

matrix.setScale(1f,-1f);将图片以y轴进行缩放处理,翻了个个,翻转后图片在画布的上方,需要将其下移操作
matrix.postTranslate(0, baseBitmap.getHeight());
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值