这节讲述Bitmap,首先可以看到它里边有两个枚举类,一个是Bitmap.CompressFormat,另一个是Bitmap.Config。第一个包含的是Bitmap可用于指定的压缩格式,有JPEG,PNG,WEBP三种格式。第二个包含的是Bitamap的有可能用到的颜色组合,有ALPHA_8 ,ARGB_4444,ARGB_8888,RGB_565。明显可以看出ARGB_4444是ARGB_8888的低质量组合状态,RGB_565是一种比较常用的颜色组合方式,尤其是在空间比较紧张又希望图片质量不太差的时候经常使用这种颜色组合。接下来有常量
int | DENSITY_NONE |
这个常量标示着Bitmap创建时用的是一个未知的density。
下面开始看函数功能:
public boolean compress (Bitmap.CompressFormat format, int quality, OutputStream stream)
Bitmap在指定的输出流上写入一个压缩的版本,根据format,quality。quality比较压缩版本的质量,最大值为100,像png这样的无损耗的压缩格式,quality的值会被忽略。如果该函数返回true,那么Bitmap可以从BitmapFactory中重新读取一个输入流,变成另一个图片。注意不是所有的格式都支持所有的颜色组合方式,所以Bitmap通过BitmapFactory生成的时候可能就拥有不同的颜色组合方式,有可能会失去每个点的透明度(比如JPEG就只支持不透明的点)
public Bitmap copy (Bitmap.Config config, boolean isMutable)
按Bitmap的尺寸创建一个新的Bitmap,具体方法为指定一个颜色组合方式,然后将Bitmap中的点都复制到新Bitmap中,如果这种转变或者复制不成功的话将会返回null, isMutable表示新生成的Bitmap中的点是否可以改变,true为可以,值得注意的是新生成的bitmap和老bitmap有相同的density
public void copyPixelsFromBuffer (Buffer src)
从buffer中复制点到Bitmap中,并且从初始位置开始会覆盖掉Bitmap中原来的点,复制过程中buffer的点不会以任何方式改变,不管原bitmap格式如何都会以32位的方式写入
public void copyPixelsToBuffer (Buffer dst)
将Bitmap中的点复制到指定的buffer当中,如果dst的空间不够大不能容下bitmap中的所有点,或者dst不是ByteBuffer, ShortBuffer, IntBuffer这三种之一,那么函数会抛出异常
public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
静态函数,从目标bitmap中截取一段点集返回一个不可改变的bitmap,截取的范围由Matrix m来决定,返回的bitmap和目标有相同的density,x,y,width,height分别为目标的起点和宽高,filter表示目标是否需要过滤,只有在Matrix包含更多信息的时候才会用到。
public static Bitmap createBitmap (int width, int height, Bitmap.Config config)
返回一个指定了宽高的可以改变里边的点的内容的bitmap,它的density来源于当前屏幕的density。
public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height)
返回一个不可改变的bitmap,该bitmap与目标bitmap内容一样。
public static Bitmap createBitmap (int[] colors, int offset, int stride, int width, int height, Bitmap.Config config)
返回一个不可改变的bitmap,里边的点的值有colors数组一一对应的设定,offset表示colors数组中的颜色值是从哪个下标开始,stride表示colors数组中每一行有多少个颜色值,该值必须大于width。当width,height没有大于0,或者数组的长度小于bitmap的点的数量时就会抛出异常。
public static Bitmap createBitmap (Bitmap src)
创建一个目标bitmap的复制样本bitmap,并且该样本不可改变。
public static Bitmap createBitmap (int[] colors, int width, int height, Bitmap.Config config)
返回一个不可改变的bitmap,里边的点的值有colors数组一一对应的设定。
public static Bitmap createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)
返回一个由目标bitmap按比例缩放了的新bitmap,该bitmap的宽高由dstWidth,dstHeight决定。
public int describeContents ()
返回一个标志位,标志着指定目标类型在包里边被整理的设置
public void eraseColor (int c)
将指定颜色填满到bitmap中,当该bitmap不可改变时将会抛出异常
public Bitmap extractAlpha ()
返回一个新的bitmap,该bitmap包含了目标bitmap的所有ARGB中的A值,它可以通过Canvas.drawBitmap()画出来,因为颜色值可以由paint补充到画布上
public Bitmap extractAlpha (Paint paint, int[] offsetXY)
返回一个新的bitmap,该bitmap包含了目标bitmap的所有ARGB中的A值,由于该bitmap的值会被paint所影响,比如paint有自己的A值,或者是存在着模糊不清的东东来改变该bitmap的尺寸,所以加入了offsetXY的参数,当offsetXY不为null时,它返回的是生成的bitmap能更好的符合目标bitmap的位移,比如paint包含一块半径为2的污迹,那么offsetXY包含-2,-2,然后画生成bitmap的时候从-2,-2开始画,能让paint的污迹在显示结果上跟目标bitmap更相近。
public final int getByteCount ()
返回有多少字节用来存储该bitmap的点
public final Bitmap.Config getConfig ()
如果目标bitmap的颜色组合方式是Bitmap.Config中的那几种之一,那么返回该组合方式,否则返回null
public int getDensity ()
获取该bitmap的density,默认的density跟当前屏幕的density是一样的,除非当前应用不支持多种屏幕density,不管什么情况都用系统默认的density,注意兼容方式由应用的开始的加载工序所决定--分享相同的工序,拥有相同的density,能确保大家明白无误的给bitmap设定一个正确的density。
public int getGenerationId ()
获取bitmap的当前id,当bitmap发生改变时,当前id会同时发生改变,这样判断bitmap有没有改变的一个有效的方法就是检查它的当前id。
public final int getHeight ()
获取高度
public byte[] getNinePatchChunk ()
返回一个选项数组,由UI系统应用在某些bitmap上,不会刻意的被应用所访问
public int getPixel (int x, int y)
返回该bitmap在当前点的颜色值,当x,y不在bitmap的范围内的时候会抛出异常
public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)
获取bitmap的内容一个数组,pixels每个值都是该bitmap在对应点上的颜色值,参数stride表示要将bitmap中的行与行之间的颜色值也存储在数组中,不过一般情况下该值都是取width
public final int getRowBytes ()
计算bitmap中行与行之间所包含的字节数,注意这指的是bitmap一开始时存在的行间字节数,如果你用了getPixels和setPixels(),,那么该bitmap中的每一个点都变成32位的颜色值了
public int getScaledHeight (int targetDensity)
返回bitmap的比例高度,比例因子为画布的当前density除以bitmap的density
public int getScaledHeight (DisplayMetrics metrics)
public int getScaledHeight (Canvas canvas)
public int getScaledWidth (DisplayMetrics metrics)
public int getScaledWidth (int targetDensity)
public int getScaledWidth (Canvas canvas)
获取比例高度或者比例宽度,比例因子与给定的参数有关
public final int getWidth ()
获取宽度
public final boolean hasAlpha ()
判断该bitmap是否有透明点,如过为false,可以标记该bitmap不含有任何透明点,比如RGB_565的方式,就可以知道没有任何透明点
public final boolean isMutable ()
返回值表示该bitmap是否可被改变
public final boolean isRecycled ()
判断该bitmap是否被重复应用,如果是的话那么使用它的点会报错,并且它不会被画出来
public void prepareToDraw ()
重建任何跟画出ibtmap有关联的内存,对于要清除的bitmaps来说,该调用有利于确定它的每个点都被解码了,如果这个方法被好几个bitmap按顺序调用,那么它使用的优先级是先进后出,比如最后一个调用的拥有最高的优先级,如果bitmap没有跟它有关联的内存,那么这个调用也是无害的
public void recycle ()
释放与该bitmap相关联的对象,并且清除它的点数据的引用,但是不会同步的清除点数据,点数据会被简单的当成垃圾回收,当它没有任何引用的时候。该bitmap被标记死亡的话,调用getPixels() or setPixels()都会抛出异常,并且不会画出任何东西,该操作不可被逆转,所以当你要调用它时,你要确定该bitmap是不打算用了的,这是一个很超前的调用方法,正常是不需要调用的,因为垃圾回收器会自动将它回收,在该bitmap没有任何引用的时候
public boolean sameAs (Bitmap other)
判断该bitmap是否与other拥有相同的尺寸,颜色组合方式,点数据,,如果有一项不一样,就返回false,如果other为null,那就返回false
public void setDensity (int density)
给bitmap设置一个density,当画到canvas的时候,canvas也有一个density,那么bitmap会适当的缩放
public void setHasAlpha (boolean hasAlpha)
当知道该bitmap全不都是不透明的点或者知道它有部分透明点后,给它设置的一个标志,像RGB_565的编码方式,这个调用是被忽略的,因为它全是不透明点,这个标志在画bitmap的时候可以作为一个画的线索,当知道全部是不透明点时可以画得更快比有可能有透明点的时候
public void setPixel (int x, int y, int color)
设置x,y点的颜色值
public void setPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)
将bitmap中的点全部用pixels中的点相应的代替,参数与getPixels类似,当bitmap不可改变时,或者x,y,width,height超出了bitmap的边界时,或者pixels小于不能支持指定的点数目时都会抛出异常
public void writeToParcel (Parcel p, int flags)
将该bitmap和它的数据写到块里边去,该bitmap可以被重建,通过调用CREATOR.createFromParcel().