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());
时间: 2024-08-07 20:59:43

Android多媒体图像的处理的相关文章

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

android多媒体框架学习 详解 最新版本

一:多媒体框架概述   jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现了media 在整个android系统中的重要性!framework/av下都是些C/C++代码(libmedia,libmediaplayerservice,libstagefright),jni和 java api 还是保留在原来的位置,改革还不够彻底,但还是迈出了这一步,以后维护能更好的进

[Android] 给图像添加相框、圆形圆角显示图片、图像合成知识

    前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放.移动.绘制和添加水印,继续我的"随手拍"项目完成给图片添加相框.圆形圆角显示图片和图像合成的功能介绍.希望文章对大家有所帮助. 一. 打开图片和显示assets文件中图片 首先,对XML中activity_main.xml进行布局,通过使用RelativeLayout相对布局完成(XML代码后面附).然后,在Mainctivity.java中public class MainActivity e

Android多媒体数据库之MediaStore研究

应网友要求,今天给大家讲android的多媒体数据库.MediaStore这个类是android系统提供的一个多媒体数据库,android 中多媒体信息都可以从这里提取.这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口 进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作了.今天我就介绍 一些这些接口的用法. 首先,要得到一个ContentResolver

[Android] 给图像加入相框、圆形圆角显示图片、图像合成知识

    前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放.移动.绘制和加入水印,继续我的"随手拍"项目完毕给图片加入相框.圆形圆角显示图片和图像合成的功能介绍.希望文章对大家有所帮助. 一. 打开图片和显示assets文件里图片 首先,对XML中activity_main.xml进行布局,通过使用RelativeLayout相对布局完毕(XML代码后面附).然后,在Mainctivity.java中public class MainActivity e

Android多媒体框架图

Android多媒体整体架构图 MediaPlayer框架图 Camera框架图 SoundRecorder框架图 VideoCamera框架图 OpenCore与Skia ALSA Audio框架图 Video Overlay框架图 Camera HAL演化图

Android多媒体框架对音乐播放器的支持

下面介绍一下Andriod多媒体框架对开发者提供的支持有哪些. 1. MediaScannerReceiver 这个广播接收者在接收到ACTION_BOOT_COMPLETED.ACTION_MEDIA_MOUNTED或 ACTION_MEDIA_SCANNER_SCAN_FILE 广播时对SD卡中的图片.音乐和视频文件进行了扫描,因为扫描不能影响用户使用,这里启动了一个服务MediaScannerService,扫描的文件类型如下: /* Audio */ addFileType("MP3&q

Android多媒体整体架构图

Android多媒体整体架构图 MediaPlayer框架图 Camera框架图 SoundRecorder框架图 VideoCamera框架图 OpenCore与Skia ALSA Audio框架图 Video Overlay框架图 Camera HAL演化图

Android多媒体访问

Android的多媒体文件主要存储在/data/data/com.android.providers.media/databases目录下,该目录下有两个db文件,一个是内部存储数据库文件(internal.db),一个是存储卡数据库(external-XXXX.db).媒体文件的操作主要是围绕着这两个数据库来进行.这两个数据库的结构是完全一模一样的. Android提供了MediaStore类,该类是一个ContentProvider,管理着设备上自带的和外部的多媒体文件,同时包含着每一个多媒