多媒体:(包含文字 图片 音频 视频)
一、 计算机表示图形的几种方式
图形的大小 = 图片的总像素 * 每个像素的大小
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/dalvikvm-heap(2128): Out of memory on a 30720012-byte allocation.
②解决问题
screenWidth = wm.getDefaultDisplay().getWidth();
screenHeight = wm.getDefaultDisplay().getHeight();
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;
options.inSampleSize=scale;//第4步计算的缩放比
//6.开始真正的解析位图
options.inJustDecodeBounds=false;
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg", options);
三、创建原图的副本
①提出问题
②解决问题(直接上代码)
//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);
四、图形的处理
//matrix.setTranslate(0, srcBitmap.getHeight());//错误
matrix.postTranslate(0, srcBitmap.getHeight());
五、总结
Android中像素是以ARGB来表示,其中图形大小=像素个数*每个像素大小。加载大图片时怎么解决。作图时我们需要画布(Canvas),画笔(Paint)。图形处理使用Matrix,重点记住set与post的区别。