美文网首页
Bitmap二次采样

Bitmap二次采样

作者: Topone | 来源:发表于2021-01-18 10:59 被阅读0次

java代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView imageView = (ImageView) findViewById(R.id.iv);
        String filePath = Environment
                .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                .getAbsolutePath() + File.separator + "map.bmp";
        Bitmap bitmap = BitmapUtils.getBitmap(filePath, 400, 400);
//        Bitmap bitmap = BitmapFactory.decodeFile(filePath);
        imageView.setImageBitmap(bitmap);
    }
}

工具类:

public class BitmapUtils {
    /**
     * @param filePath   文件的绝对路径
     * @param destWidth  控件的宽
     * @param destHeight 控件的高
     * @return
     */
    public static Bitmap getBitmap(String filePath, int destWidth, int destHeight) {
        /**********************************第一次采样**************************************/
        //加载图片时的选项
        BitmapFactory.Options options = new BitmapFactory.Options();
        //是否只加载图片的边框
        options.inJustDecodeBounds = true;
        //加载图片,此时的加载只能够获取到图片的边框
        BitmapFactory.decodeFile(filePath, options);
        //获取原图的宽度
        int outWidth = options.outWidth;
        //获取原图的高度
        int outHeight = options.outHeight;
        Log.d("lenve", "getBitmap: outWidth:" + outWidth + ";outHeight:" + outHeight);
        //缩放比例
        int sampleSize = 1;
        //计算缩放比例,sampleSize必须是2的n次幂
        while (outWidth / sampleSize > destWidth || outHeight / sampleSize > destHeight) {
            sampleSize *= 2;
        }
        Log.d("lenve", "getBitmap: sampleSize:" + sampleSize);
        /*********************************第一次采样结束,第二次采样开始*****************************************/
        //不仅仅只加载图像的边框,也加载图像中的像素点
        options.inJustDecodeBounds = false;
        //设置缩放比例
        options.inSampleSize = sampleSize;
        //ARGB_8888,表示一个像素点的透明度以及三原色各占8位,共计32位,即4个字节
        //ALPHA_8,表示一个像素点只有透明度,没有三原色,此时,一个像素点占8位,即1个字节
        //ARGB_4444,表示一个像素点的透明度以及三原色各占4位,共计16位,即2个字节
        //RGB_565,这种色彩模式不能表示透明度,红绿蓝三色各占5、6、6位,共计16位,即2个字节
        //设置图像的色彩模式,共有4种取值
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        //加载bitmap并返回
        return BitmapFactory.decodeFile(filePath, options);
    }
}

BitmapFactory在解码图片时,可以带一个Options,有一些比较有用的功能,比如:

  • inTargetDensity表示要被画出来时的目标像素密度

  • inSampleSize这个值是一个int,当它小于1的时候,将会被当做1处理,如果大于1,那么就会按照比例(1/inSampleSize)缩小bitmap的宽和高、降低分辨率,大于1时这个值将会被处置为2的倍数。例如,width=100,height=100,inSampleSize=2,那么就会将bitmap处理为width=50,height=50,宽高降为1/2,像素数降为1/4。

  • inJustDecodeBounds字面意思就可以理解就是只解析图片的边界,有时如果只是为了获取图片的大小就可以用这个,而不必直接加载整张图片

  • inPreferredConfig默认会使用ARGB_8888,在这个模式下一个像素点将会占用4个byte,而堆一些没有透明度要求或者图片质量要求不高的图片,可以使用RGB_565,一个像素只会占用2个byte,一下可以省下50%内存

  • inPurgeable和inInputShareable这两个需要一起使用,BitmapFactory.java的源码里面有注释,大致意思是表示在系统内存不足时是否可以回收这个bitmap,有点类似软引用,但是实际在5.0以后这两个属性已经被忽略,因为系统认为回收后再解码实际会反而可能导致性能问题

  • inBitmap官方推荐使用的参数,表示重复利用图片内存,减少内存分配,在4.4以前只有相同大小的图片内存区域可以复用,4.4以后只要原有的图片比将要解码的图片大即可以复用了

相关文章

  • Bitmap 二次采样

    Bitmap二次采样 一、二次采样: (一)、意义或目的: 1、用BitmapFactory解码一张图片时,有时会...

  • Android Bitmap二次采样

    Bitmap二次采样 一、二次采样: (一)、意义或目的: 1、用BitmapFactory解码一张图片时,有时会...

  • Android回顾--(二十六) Bitmap二次采样

    Bitmap的二次采样 一、二次采样 (一)、意义和目的 用BitmapFactory解码有一张图片时,有时会遇到...

  • Android之Bitmap的二次采样

    其实Bitmap的二次采样就那么回事,别怕,我们现在来鸡婆它! 1、为什么要二次采样Android app开发过程...

  • Bitmap二次采样

    1、为什么要二次采样 不知道大家在开发App的过程中有没有遇到过类似于图片墙这样的功能?在做图片墙的时候你有没有遇...

  • Bitmap二次采样

    java代码: 工具类: BitmapFactory在解码图片时,可以带一个Options,有一些比较有用的功能,...

  • BitMap压缩以及二次采样

    BitMap压缩以及二次采样 标签: Android 首先我们来了解一下什么是oom? 1.什么是OOM?为什么会...

  • Bitmap图片处理,二次采样

    java代码: 工具类: BitmapFactory在解码图片时,可以带一个Options,有一些比较有用的功能,...

  • bitmap二次采样和图片模式

    二次采样 日常开发中,有时会需要加载体积比较大的图片,而实际上imageView的大小也往往不足以显示图片文件的所...

  • Android Bitmap优化

    Bitmap 的采样压缩(这个采样率是根据需求来进行生成的),使用到了inBitmap内存复用和 inJustDe...

网友评论

      本文标题:Bitmap二次采样

      本文链接:https://www.haomeiwen.com/subject/gowtzktx.html