Android Day10-多媒体

多媒体指的就是   文字、图片、音频、视频

一、图片篇

 1.图片大小的计算

图片大小  =   分辨率 * 位深/8            (以字节为单位)

分辨率:就是图片的长*宽,单位是相素。

位深:就是每个相素所占的二进制位数。(右击图片的属性可以查看图片的位深)

对于BMP图片,有以下几种存储格式:

1)单色:每个像素最多能够表示2种颜色, 2 = 2的1次方,只要使用长度为1的二进制位来表示

位深为1,那么一个像素占1/8个byte,也就是Log22  /  8。

2)16色:每个像素最多能够表示16种颜色,16=2的4次方,只要使用长度为4的二进制位来表示

示,位深为4,那么一个像素占4/8个byte ,也就是Log216  /  8。

3)256色:每个像素最多能够表示256种颜色,256=2的8次方,只要使用长度为8的二进制位来

表示,位深为8,那么一个像素占8/8个byte  ,也就是Log2256  /  8。

4) 24位:每个像素最多能够表示1600多万多种颜色,16777216 = 2的24次方,只要使用长度

为24的二进制位来表示,位深就为24,那么一个像素占 24 / 8个byte,也就是

Log216777216 / 8。

下面这个是我截的图:

  
           对于其它常见格式的图片,如PNG、 JPG等,图片采用了压缩算法进行了压缩,所以图片像素的

大小不能轻易的算出来,此处暂不花费过多的时间去研究。

2.Android下图片大小的计算

在Android系统下,通常用BitmapFactory来加载图片。

Android
Bitmap的默认加载使用ARGB_8888色彩模式,每个像素会占用4byte。

比如:一个512*512的图片,无论什么格式,加载进入内存都占用512*512*4=1MB,所

以,Android图片占用内存大小,只与图片的分辨率(像素)以及加载使用的色彩模式有关)

补充参考链接: http://www.cnblogs.com/fengzhblog/p/3227471.html

http://my.oschina.net/u/1389206/blog/324731

3.Android下加载大图片

1)oom异常

我利用Android提供的ImageView控件来直接加载一张2400*3200相素的图片

             ImageView iv = (ImageView) findViewById(R.id.iv);
        
             Bitmap srcBitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + "/bigpic.bmp");
             iv.setImageBitmap(srcBitmap);

然后报了下面这个异常:

                 上面我用红色矩形标记的那一行,意思就是说30720012字节分配超过了heap size的最大值

16777216字节。那么这两个数字是怎么来的呢?

在创建AVD的时候,我给heap size分配的内存为16MB = 16777216字节,所以16777216

指的是AVD的heap size,这个参数是虚拟机给每个应用程序分配的最大内存空间。

在上面图片大小的计算中,已经说到了 Android中图片大小计算的方法,我的代码是采用

Bitmap来加载图片的,所以图片的大小为2400*3200*4 = 30720000(与30720012相比少了12

个字节???)

可见,Android在加载图片的时候,图片的分辨率如果过大的话,就会发生内存溢出异常

out of memory。那么下面就介绍Android中如何避免这个异常出现。

2)缩放加载大图片

图片分辨率(尺寸)过大,那么加载的时候就把图片尺寸变小,那么应该怎么变小呢?一般

情况就是根据手机的屏幕分辨率来加载图片的。步骤如下:

第1步:获取手机分辨率

第2步:获取图片分辨率

第3步:计算绽放比

第4步:按绽放比去加载图片

代码如下:

        //[1]获取手机分辨率    通过WindowManager这个类去实现。
        //得到WindowManager对象
            WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        //得到display对象
            Display display = windowManager.getDefaultDisplay();
            int screen_width  = display.getWidth();
            int screen_height = display.getHeight();
        
        //[2]获取图片的分辨率
            File file = new File(Environment.getExternalStorageDirectory().getPath() + "/dog.bmp");
            BitmapFactory.Options opts = new Options();
            opts.inJustDecodeBounds = true;        //表示不会为图片的像素分配内存空间
            BitmapFactory.decodeFile(file.getPath(), opts);        
            //当opts的上面这个属性设为true时,这个方法会返回null,但是会将
            //图片的size信息存放到opts对象里。关于这个方法的使用,API说得很明白。
            int pic_width = opts.outWidth;
            int pic_height = opts.outHeight;
        //[3]计算缩放比
            int scale = 1;    //最终用的缩放比
            //我个人认为严密的计算缩放比应该是向上取舍
            int scale_x = (int) Math.ceil(pic_width * 1.0 / screen_width);
            int scale_y = (int) Math.ceil(pic_height * 1.0 / screen_height);
            scale =  scale_x > scale_y ? scale_x:scale_y ;
            //如果缩放比小于或等于1,就没有必要缩放了。
            scale = scale > 1 ? scale:1;
        //[4]按绽放比去加载图片
            opts.inSampleSize = scale;    
            //指定加载图片时的缩放比,如果为4,图片的大小会变成原来的1/16。
            //关于这个属性,API说得很明白。
            opts.inJustDecodeBounds = false;
            Bitmap scaledBitmap = BitmapFactory.decodeFile(file.getPath(), opts);
            iv.setImageBitmap(scaledBitmap);
时间: 2024-08-19 03:51:10

Android Day10-多媒体的相关文章

Android的多媒体编程

多媒体编程 1.什么是多媒体? 多种媒体的综合. 图片.音乐.视频等: ##图片的常见格式: 1.bmp:以高质量保存所有类型的图片,并将其应用于计算机: 255 KB,255*340像素,24位深度 计算机表示图形的时候时候是使用像素点来表示的,每个像素点都有一个颜色,每个颜色都是使用6位16进制的数值来表示的,一个像素点使用24个bit表示. 图像大小的计算公式:分辨率的宽*高*位深度 + 头文件占用的数据大小=图形实际大小 ,颜色不会失真,图片的体积比较大. 2.jpg:36.4 KB,2

转:android中多媒体解码openmax的实现

转自:http://blog.csdn.net/hellofeiya/article/details/8601168 每个AwesomePlayer 只有一个OMX服务的入口,但是AwesomePlayer不一定就只需要1种解码器.有可能音视频都有,或者有很多种.这个时候这些解码器都需要OMX的服务,也就是OMX那头需要建立不同的解码器的组件来对应着AwesomePlayer中不同的code.OMX中非常重要的2个成员就是 OMXMaster 和 OMXNodeInstance.OMX通过这俩个

android获取多媒体库的视频、音频、图片

从媒体库中查找音频.视频.图片文件的相关信息,并获取视频.图片.专辑图片的缩略图 和一些文件操作 package com.uwatch.swconnectservice.util; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import ja

第六十五讲:Android之多媒体(Media)(三)

知识使用才有价值,智能共享方显实力! 本讲内容:MediaRecoder 类 录音的使用 一.使用MediaRecorder录制音频实现步骤: 1.创建MediaRecorder对象 2.通过MediaRecoder对象的setAudioSource()方法设置录音的来源 3.通过MediaRecoder对象的setOutputFormat()设置输出格式 4.通过MediaRecoder对象的setAudioEncoder().setAudioEncodeingBitRate(int bitR

Android手机多媒体——通知

一 创建手机通知 1.创建一个NotificationManager 创建一个NotificationManager来对通知就行管理.一般调用context的getSystemService()方法得到这个对象,这个方法传入要获取的服务,返回的是一个该类型的值.如下: /*获取到一个NotificationManager来对通知进行管理, * 使用的是getSystemService方法,传入一个服务,返回一个manager*/ NotificationManager manager = (No

Android手机多媒体——拍照和相册

一 拍照功能 1.布局文件:在线性布局中设置一个按钮,用来启动拍照功能,设置一个ImageView用来展示图像 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" 4 android:orie

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

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

android 多媒体数据库(非原创)

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

Android多媒体--MediaCodec 中文API文档

*由于工作需要,需要利用MediaCodec实现Playback及Transcode等功能,故在学习过程中翻译了Google官方的MediaCodec API文档,由于作者水平限制,文中难免有错误和不恰当之处,望批评指正. *转载请注明出处:http://www.cnblogs.com/roger-yu/ MediaCodec public final class MediaCodec extends Object Java.lang.Object → android.media.MediaCo

Android多媒体开发-stagefright及AwesomePlayer相关知识梳理

android的多媒体框架中, stagefright其实是AwesomePlayer的代理,就是个皮包公司. status_t StagefrightPlayer::setDataSource( const char *url, const KeyedVector<String8, String8> *headers) { return mPlayer->setDataSource(url, headers); } status_t StagefrightPlayer::prepare