Bitmap是一种用于处理图片的工具,在我们的日常生活中,我们经常使用各种类型的图片,包括.png、.gif、.9.png、.jpg和各种Drawable系对象。而Bitmap对于程序的高效性和健壮性起着很大的影响。
但是你可能会好奇,既然有了Bitmap,为什么我们不能直接使用它来传输图片呢?原因是位图文件没有进行压缩,占用的存储空间比较大。
Bitmap有许多有用的方法,比如可以获取图像的宽度和高度,可以释放位图,判断位图是否已释放和是否可修改,还可以进行压缩和创建指定的位图。此外,它还可以从不同的数据源解析和创建Bitmap对象,比如文件、输入流、资源文件、字节数组、文件描述符等等。这意味着我们可以通过Bitmap来决定图片以何种方式加载到内存中。
在处理Bitmap时,有一些注意事项值得我们关注。比如,decodeFileDescriptor方法比decodeFile方法更高效,这是通过查看源码得知的。建议我们使用decodeStream代替decodeResource,因为BitmapFactory.decodeResource加载的图片可能会经过缩放,而且这个缩放是在java层进行的,效率比较低,还会消耗java层的内存。相比之下,BitmapFactory.decodeStream不会对加载的图片进行缩放,所以它占用的内存更少,效率更高。当然,这两个方法都有各自的用处,如果对性能要求较高,我们应该使用decodeStream;如果对性能要求不高,但是需要Android自带的图片自适应缩放功能,那么可以使用decodeResource。
还有一些其他的方法,比如canvas和Matrix,它们可以对Bitmap进行旋转、放缩、平移、切割等操作。我们可以使用一些类似Bitmap.onCreateBitmap、Canvas的clipRect和clipPath等方式来实现这些操作。
在初始化Bitmap对象的过程中,有可能会发生OutOfMemory异常。为了避免应用崩溃,我们对这种异常进行了捕获,并提供了一个默认的Bitmap图。另外,如果我们不进行缓存,在使用BitmapFactory类的方法来实例化Bitmap时,每次都会得到一个新的Bitmap对象,这会造成内存的浪费。所以缓存可以避免创建多个Bitmap对象,节约内存的使用。
如果图片的像素过大,在使用BitmapFactory类的方法实例化Bitmap的过程中,需要大于8M的内存空间,这就会导致OutOfMemory异常的发生。为了避免异常的发生,我们可以将图片缩小,减少在加载图片时使用的内存。
总的来说,Bitmap是一个非常有用的工具,它可以帮助我们处理各种类型的图片。在使用Bitmap时,我们需要注意一些事项,比如选择合适的方法、进行缓存、防止内存溢出等等。希望通过上述内容,对Bitmap有一个更全面的了解。