首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Android中加载大图片

在Android中加载大图片
EN

Stack Overflow用户
提问于 2014-04-10 20:07:33
回答 5查看 938关注 0票数 1

众所周知,Android在RAM内存中存储位图数据时存在问题。我需要在View上加载一个图像( 13Mpx相机的照片),然后我需要能够放大和缩小图像。图像应该是可变的。现在它是这样实现的:

代码语言:javascript
运行
复制
BitmapFactory.Options options =  new BitmapFactory.Options();
options.inMutable = true;
_bitmap = BitmapFactory.decodeFile(_path, options);

当我拍摄一张大照片(13或8mpx)时,程序崩溃并出现“内存不足”错误。我需要一些解决这个问题的方法。我需要一些类,可以加载和操作(缩放它)与大图像。它需要等于或小于API-8。

我尝试了通用图像加载器,但它没有缩放选项。有人知道如何解决这个问题吗?

EN

回答 5

Stack Overflow用户

发布于 2014-04-10 20:13:59

位图占用每个像素4字节==> 13MP等于52MB内存。您应该先使用BitmapFactory.Options来获取大小。通过使用inJustDecodeBounds,您可以获得包含所有元数据的Bitmap对象,但不包含实际图像。

代码语言:javascript
运行
复制
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;

然后计算屏幕所需的缩放大小:

代码语言:javascript
运行
复制
public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

    final int halfHeight = height / 2;
    final int halfWidth = 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;
}

并使用它来加载位图的缩放版本:

代码语言:javascript
运行
复制
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

这一切都在Developer Guide中进行了解释

票数 2
EN

Stack Overflow用户

发布于 2014-04-10 20:11:16

我推荐使用Square的Picasso库。以及用于图像缩放的PhotoView

票数 1
EN

Stack Overflow用户

发布于 2014-04-10 20:13:50

尝试此操作以缩放位图

代码语言:javascript
运行
复制
final BitmapFactory.Options options = new BitmapFactory.Options();
                            options.inJustDecodeBounds = true;

                            /*
                             * If set to a value > 1, requests the decoder to
                             * subsample the original image, returning a smaller
                             * image to save memory. The sample size is the
                             * number of pixels in either dimension that
                             * correspond to a single pixel in the decoded
                             * bitmap. For example, inSampleSize == 4 returns an
                             * image that is 1/4 the width/height of the
                             * original, and 1/16 the number of pixels. Any
                             * value <= 1 is treated the same as 1. Note: the
                             * decoder uses a final value based on powers of 2,
                             * any other value will be rounded down to the
                             * nearest power of 2.
                             */
                            options.inSampleSize = 2;

                            // Decode bitmap with inSampleSize set
                            options.inJustDecodeBounds = false;

                            bitmap = BitmapFactory.decodeFile(path, options);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22987573

复制
相关文章

相似问题

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