android开发之bitmap使用

bitmap是android中重要的图像处理工具类,通过bitmap可以对图像进行剪切、旋转、缩放等操作,同时还可以指定格式和压缩质量保存图像文件。


一、拿到一个Bitmap对象


查看源码我们知道,Bitmap被final修饰,因此不可以通过new来获得一个bitmap的实例,获得一个Bitmap对象一般都是通过BitmapFactory来获得,主要有以下几方式。

这里写图片描述

每一个方法都有自己的重载方法,重载方法多出的参数是Options,解释一下这个参数,这个主要是对生成Bitmap对象做一些简单的处理。

inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。

inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。

inSampleSize 设置decode时的缩放比例。当值大于1时会对图像进行压缩,比如设置为4时,返回的图像宽高都将是原始图像的四分之一,像素是原始图像的十六分之一,如果设置的值小于1,则会被当作1来处理。注意,这里设值必须是2的次幂,其他值会被就近取离2的次幂最近的值。

通过option的这些属性,我们就可以获得一张图片的缩略图啦,一个基本思路是先设置inJustDecodeBounds为true,拿到图像的基本信息,比如宽和高,根据基本信息结合缩略图目标宽高,算出inSampleSize ,然后再设置inJustDecodeBounds为false,获得缩略图。

想要获得一个Bitmap对象,可以通过一个图像的完整路径,或者是通过一个字节流或者是通过字节亦或者是通过本地的资源文件,都可以获得一个Bitmap对象。

if (Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED)) {
                // /storage/emulated/0/DCIM/Camera/123.jpg
                String path = Environment.getExternalStorageDirectory()
                        .getAbsolutePath()
                        + File.separator
                        + "DCIM"
                        + File.separator
                        + "Camera"
                        + File.separator
                        + "123.jpg";
                BitmapFactory.Options option = new BitmapFactory.Options();
                option.inSampleSize = 1;
                //通过完整路径获得Bitmap对象
                Bitmap bm = BitmapFactory.decodeFile(path,option);
                FileInputStream is = new FileInputStream(new File(path));
                //通过一个输入流获得Bitmap对象
                Bitmap bm2 = BitmapFactory.decodeStream(is);
                //通过本地资源获得一个Bitmap对象
                Bitmap bm1 = BitmapFactory.decodeResource(getResources(),
                        R.drawable.ic_launcher);
                iv.setImageBitmap(bm2);
            }

二,保存图像文件


拿到了Bitmap之后可以直接显示出来,也可以先保存到本地等待处理,Bitmap可以保存为jpg,png,gif等格式,保存方式也是非常简单:

Bitmap bp = revitionImageSize(path + "123.jpg");
                FileOutputStream out = new FileOutputStream(path + "456.gif");
                //0意味着压缩到最小,100意味着压缩后的质量最好,PNG是无损图像,会忽略这个参数
//              bp.compress(Bitmap.CompressFormat.JPEG, 100, out);
                bp.compress(Bitmap.CompressFormat.PNG, 0, out);
                out.flush();
                out.close();

直接调用compress方法,第一个参数表示压缩的方式,有多种,PNG属于无损压缩,JPEG是有损压缩。第二个参数表示压缩质量,取值为0-100,100表示压缩图像质量最高,但同时压缩率低,0表示压缩图像质量最差,同时压缩率高。但是,这个参数是否有效与第一个参数有关,如果第一个参数选择了PNG,及无损压缩,那么第二参数是无效的。第三个参数是你要输出的字节流。


本文参考

本文源码下载

原文地址:https://www.cnblogs.com/qitian1/p/6461762.html