首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Android中解码大小合适的位图

在Android中解码大小合适的位图
EN

Stack Overflow用户
提问于 2010-04-15 07:22:43
回答 11查看 72.7K关注 0票数 62

我使用BitmapFactory.decodeFile解码SD卡中的位图。有时位图比应用程序需要的或堆允许的大,所以我使用BitmapFactory.Options.inSampleSize请求一个二次采样(较小)的位图。

问题是平台并不强制使用inSampleSize的确切值,而我有时最终得到的位图要么太小,要么对于可用内存来说仍然太大。

来自http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

注意:解码器将尝试满足此请求,但生成的位图可能具有与请求完全相同的不同尺寸。此外,对于解码器来说,2的幂通常更快/更容易。

我应该如何从SD卡解码位图,以获得我需要的确切大小的位图,同时消耗尽可能少的内存来解码它?

编辑:

当前源代码:

代码语言:javascript
复制
BitmapFactory.Options bounds = new BitmapFactory.Options();
this.bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, bounds);
if (bounds.outWidth == -1) { // TODO: Error }
int width = bounds.outWidth;
int height = bounds.outHeight;
boolean withinBounds = width <= maxWidth && height <= maxHeight;
if (!withinBounds) {
    int newWidth = calculateNewWidth(int width, int height);
    float sampleSizeF = (float) width / (float) newWidth;
    int sampleSize = Math.round(sampleSizeF);
    BitmapFactory.Options resample = new BitmapFactory.Options();
    resample.inSampleSize = sampleSize;
    bitmap = BitmapFactory.decodeFile(filePath, resample);
}
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-07-30 00:57:03

您走在了正确的轨道上,但是您正试图同时做两件事:读取文件并将其缩放到适当的大小。

第一步是将文件读取到比所需的位图稍大的位置,使用BitmapFactory.Options.inSampleSize确保在只需要较小的缩略图或屏幕分辨率图像时读取较大的位图不会消耗过多的内存。

第二步是调用Bitmap.createScaledBitmap()以创建一个精确到所需分辨率的新位图。

确保在清理完临时位图后回收其内存。(要么让变量超出作用域,让GC处理它,要么在加载大量图像并且内存紧张的情况下调用.recycle()。)

票数 47
EN

Stack Overflow用户

发布于 2010-04-18 00:56:32

您可能想要使用。将其设置为TRUE并按原样加载文件。

图像不会加载到内存中。但是BitmapFactory.Optionsoutheightoutwidth属性将包含指定图像的实际大小参数。计算你想要对它进行多大程度的子采样。即1/2或1/4或1/8等,并相应地将2/4/8等分配给inSampleSize.

现在将inJustDecodeBounds设置为FALSE,并调用BitmapFactory.decodeFile()来加载与上面计算的图像大小完全相同的图像。

票数 17
EN

Stack Overflow用户

发布于 2012-06-03 16:22:35

首先,您需要将图像采样到最接近的采样值,以便位图可以提高内存效率,这一点您已经很好地描述过了。完成后,您可以将其放大以适合您的屏幕。

代码语言:javascript
复制
// This function taking care of sampling
backImage =decodeSampledBitmapFromResource(getResources(),R.drawable.back, width, height);

// This will scale it to your screen width and height. you need to pass screen width and height.
backImage = Bitmap.createScaledBitmap(backImage, width, height, false); 
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2641726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档