24

感谢Schermvlieger在anddev.org上提出这个问题,

我只是将他的问题复制给 SO,因为没有人在其他网站上回复,我也面临同样的问题。

我想知道就BitmapFactory.Options.inSampleSize显示图像的速度而言,最佳用途是什么。
文档提到使用 2 的幂的值,所以我正在使用 2、4、8、16 等。

我想知道的是:

  1. 我应该重新采样到仍然大于屏幕分辨率的最小尺寸,还是应该采样到刚好足以避免出现OutOfMemoryError?
  2. 如何计算在不耗尽内存的情况下仍然可以显示的图像的最大尺寸?图像的颜色深度是否也起作用,以及显示的深度?
  3. 顺便说一下,通过两种机制(BitmapFactory对于大文件,setImageURI()对于较小的文件)显示图像是否有效ImageSwitcher
  4. 是否有助于在应用程序的开头创建Bitmap,BitmapFactory.OptionsinTempStorage在需要时仅在运行中创建它们?
4

4 回答 4

12

您应该始终尝试加载和预缩放图像,以使它们尽可能接近最终显示的尺寸。在绘图时缩放图像非常昂贵,应该不惜一切代价避免。

考虑到图像的内存成本,是的,颜色深度起着非常重要的作用。ALPHA_8 格式的图像每个像素使用 1 个字节,RGB_565 或 ARGB_4444 格式的图像每个像素使用 2 个字节,ARGB_8888 格式的图像每个像素使用 4 个字节。显示的深度根本无关紧要。您应该始终尝试使用 ARGB_8888 以获得最佳质量,但如果您的图像不透明,565 就足够了。

于 2011-02-18T09:22:40.277 回答
4

您提出了很好的问题,但这完全取决于您的需求和您使用的内存量。我建议查看此链接以获取有关位图的许多提示:http: //developer.android.com/training/displaying-bitmaps/index.html

简而言之,您应该考虑缓存、下采样,并尽可能使用足够好的位图格式。

以下是我对您的问题的回答:

  1. 为什么不兼得?如果您认为可能存在 OOM,请尝试回收旧的、未使用的位图,然后再次检查。

  2. 您可以计算位图的(估计)大小:

    宽度*高度*bytesPerPixel

    其中 bytesPerPixel 通常为 4 或 2(取决于位图格式)。

  3. 从未使用过 setImageURI ,所以我无法帮助您。我建议在后台线程中下载图像(使用 asyncTask 是一种方法)并在准备好时显示它们。

  4. 如果只有少数几个你知道不会占用太多内存,我想没关系。我仍然认为缓存可能会更好。

于 2013-02-09T12:13:08.117 回答
3

在这里,您可以调用shrinkmehtod实际发送字符串文件路径和高度和宽度的用户定义方法,以减少图像到方法。

 Bitmap bit=shrinkmethod(arrpath1[position], 100, 100);


            //iv.setImageURI(Uri.parse(arrpath1[position]));
            iv.setImageBitmap(bit);

这是用户定义的以编程方式减小图像大小的方法。

Bitmap shrinkmethod(String file,int width,int height){
        BitmapFactory.Options bitopt=new BitmapFactory.Options();
        bitopt.inJustDecodeBounds=true;
        Bitmap bit=BitmapFactory.decodeFile(file, bitopt);

        int h=(int) Math.ceil(bitopt.outHeight/(float)height);
        int w=(int) Math.ceil(bitopt.outWidth/(float)width);

        if(h>1 || w>1){
            if(h>w){
                bitopt.inSampleSize=h;

            }else{
                bitopt.inSampleSize=w;
            }
        }
        bitopt.inJustDecodeBounds=false;
        bit=BitmapFactory.decodeFile(file, bitopt);



        return bit;

    }

我希望这将有助于您减小尺寸。

于 2012-03-06T06:46:17.173 回答
0

您好尝试使用此逻辑计算 inSampleSize

private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
    val (height: Int, width: Int) = options.run { outHeight to outWidth }
    var inSampleSize = 1

    if (height > reqHeight || width > reqWidth) {
        val halfHeight: Int = height / 2
        val halfWidth: Int = width / 2

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {
            inSampleSize *= 2
        }
    }

    return inSampleSize
}
于 2020-03-31T10:10:02.997 回答