从Android中的文件解码Bitmap的一部分

时间:2012-05-18 11:33:38

标签: java android bitmap

我有一个图像非常大的文件:例如9000x9000。

我无法在内存中加载Bitmap,因为堆大小。但我只需要显示这个位图的一小部分,例如rect width = 100-200和height = 200-400(子位图的结果大小= 100x200)

如何从文件中检索此位图?

注意:我不想在100x200图像中丢失质量

由于

6 个答案:

答案 0 :(得分:14)

可能有解决方案吗?

例如BitmapRegionDecoder

它适用于API10及以上......

用法:

BitmapRegionDecoder.newInstance(...).decodeRegion(...)

答案 1 :(得分:4)

可以使用RapidDecoder轻松完成。

我实际上生成了一个9000x9000 png,其文件大小约为80MB,并且成功加载了200x400大小的区域。

import rapid.decoder.BitmapDecoder;

Bitmap bitmap = BitmapDecoder.from("big-image.png")
                             .region(145, 192, 145 + 200, 192 + 400)
                             .decode();
imageView.setImageBitmap(bitmap);

适用于Android 2.2及更高版本。

答案 2 :(得分:2)

我认为您可以使用BitmapFactory方法来指定要解码的Rect。

public static Bitmap decodeStream (InputStream is, Rect outPadding, BitmapFactory.Options opts)

答案 3 :(得分:1)

试试这段代码:

public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);

        final int height = options.outHeight;
        final int width = options.outWidth;
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        int inSampleSize = 1;
        if (height > reqHeight) {
            inSampleSize = Math.round((float) height / (float) reqHeight);
        }
        int expectedWidth = width / inSampleSize;
        if (expectedWidth > reqWidth) {
            inSampleSize = Math.round((float) width / (float) reqWidth);
        }
        options.inSampleSize = inSampleSize;
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(path, options);
    }

答案 4 :(得分:0)

我认为你不能。即使在PC上,我也看不出如何在不加载整个图像的情况下做到这一点:大多数图像格式(例如PNG)都将像素数据压缩,因此您需要在开始执行之前至少解压缩IDAT块其他任何东西,基本上都会解码整个图像。

在你的鞋子里,我会尝试让服务器为我做。无论如何,你在哪里获得图像?不是来自服务器?然后尝试发出一个WS请求,它将为您提供图像的正确部分。如果图像不是来自服务器,您仍然可以将其发送到您的服务器,只返回您想要的图像部分。

答案 5 :(得分:0)

试试这段代码:

private Bitmap decodeFile(File f) {
    Bitmap b = null;
    try {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        FileInputStream fis = new FileInputStream(f);
        b=Bitmap.createBitmap(BitmapFactory.decodeStream(fis, null, o), 100, 200, 200, 400, null, null);
        fis.close();
    } catch (IOException e) {
    }
    return b;
}

我不确定,但这可能会给你一些想法