Android中的图形图像相关(多媒体1)

多媒体:(包含文字 图片 音频 视频)

一、  计算机表示图形的几种方式

 图形的大小 = 图片的总像素 * 每个像素的大小

JPG格式:它用有损压缩方式去除冗余的图像和彩色数据,获取得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像质量。

PNG格式:PNG是目前保证最不失真的格式,它汲取了GIF和JPG二者的优点,存贮形式丰富,PNG的缺点是不支持动画应用效果。 Android采用的是png格式。

GIF 格式:GIF是英文Graphics Interchange Format(图形交换格式)的缩写。顾名思义,这种格式是用来交换图片的。GIF格式的特点是压缩比高,磁盘空间占用较少。

BMP格式:BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。

其中BMP有如下存储方式:

单色 :每个像素最多可以表示2种颜色 ,只需要使用长度为1的二进制位来表示 ,那么每个像素占1/8byte 

16色 :每个像素最多可以表示16种颜色 0000 - 1111,那么只需要使用长度为4的二进制表示,那么每个像素占1/2个byte

256色:每个像素最多可以表示256种颜色  0000 0000 - 1111 1111 ,那么只需要使用长度8的二进制位表示,那么每个像素占1byte 

24位:rgb ,红(R)、绿(G)、蓝(B),其中:r 1byte   0-255 

g 1byte  0-255

b 1byte  0-255     那么一个像素占3byte 

注意:在Android中每个像素由ARGB来表示,在RGB基础上给你增加了Alpha(透明度)通道,因此每个像素占4byte。

二、Android中缩放加载大图片

①提出问题

当单张图片分辨率大于手机屏幕分辨率时,若加载图片会失败,产生如下bug:

 E/AndroidRuntime(2128): Caused by: java.lang.OutOfMemoryError            // 内存溢出,内存是与手机屏幕的大小有关
E/dalvikvm-heap(2128): Out of memory on a 30720012-byte allocation.
为了解决上述问题,我们只能通过缩放图片,因此剩下的问题就是我们应该按什么比例缩小图片。
例如:图片:2400*3200            
          手机:320*480
通过计算宽缩放:7       高缩放:6       因此我们选择整体缩放7

②解决问题

实现步骤:1.获取手机的分辨率(宽和高)
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
screenWidth = wm.getDefaultDisplay().getWidth();
screenHeight = wm.getDefaultDisplay().getHeight();
2.获取图片的分辨率
// 创建bitmap工厂的配置参数
BitmapFactory.Options options = new Options();
options.inJustDecodeBounds = true;
//true表示: 返回一个null 没有bitmap 不去真正的解析位图 但是能返回图片的一些信息(宽和高)
Bitmap decodeFile = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg", options);
// 获取图片的宽和高
int imageWidth = options.outWidth;
int imageHight = options.outHeight;
3.计算缩放比
4.按照缩放比显示图片
//5、按照缩放比显示图片
options.inSampleSize=scale;//第4步计算的缩放比
//6.开始真正的解析位图
options.inJustDecodeBounds=false;
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg", options);

三、创建原图的副本

①提出问题

为了操作图片(作画,旋转,平移,缩放等),由于直接加载的图片时原图不能进行操作,不能被修改。于是为了解决这个问题,就提出了拷贝原图得到副本,我们就可以操作副本了。

②解决问题(直接上代码)

//3.拷贝原图
//1.创建模板  srcBitmap是得到的原图。copyBitmap 是拷贝的副本
Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
//2.想作画需要一个画布 以copeBitmap为模板
Canvas canvas=new Canvas(copyBitmap);
//3.创建一个画笔
Paint paint = new Paint();
//开始作画   srcBitmap参考原图去画   matrix 矩阵 paint 画笔
canvas.drawBitmap(srcBitmap, new Matrix(), paint);

四、图形的处理

在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为以下 四个基本类型:
①旋转变换(Rotate)
②缩放变换(Scale)
③位移变换(Translate)
④错切变换(Skew)
其中,在Android的API里对于每一种变换都提供了三种操作方式:set(用于设置Matrix中的值)、post(后乘,根据矩阵的原理,相当于左乘)、pre(先乘,相当于矩阵中的右乘)
例如:倒影效果
matrix.setScale(1.0f,-1.0f);
//post是在上次修改的基础上进行修改,set 是每次都是在最初的基础上修改,会覆盖上一次的修改
//matrix.setTranslate(0, srcBitmap.getHeight());//错误
matrix.postTranslate(0, srcBitmap.getHeight());
例如:镜面效果
matrix.setScale(-1.0f, 1.0f);
matrix.postTranslate(srcBitmap.getWidth(), 0);

五、总结

Android中像素是以ARGB来表示,其中图形大小=像素个数*每个像素大小。加载大图片时怎么解决。作图时我们需要画布(Canvas),画笔(Paint)。图形处理使用Matrix,重点记住set与post的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值