7

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

由于堆大小,我无法将位图加载到内存中。但我只需要显示这个位图的一小部分,例如矩形宽度=100-200 和高度=200-400(子位图的大小=100x200)

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

注意:我不想损失 100x200 图像的质量

谢谢

4

6 回答 6

17

有没有可能解决这个问题?

例如,BitmapRegionDecoder

它应该适用于 API10 及更高版本...

用法:

BitmapRegionDecoder.newInstance(...).decodeRegion(...)
于 2012-09-03T22:20:32.030 回答
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 及更高版本。

于 2014-01-05T08:49:55.793 回答
2

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

public static Bitmap decodeStream (InputStream is, Rect outPadding, BitmapFactory.Options opts)
于 2012-05-18T11:50:29.137 回答
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);
    }
于 2016-10-01T08:02:39.887 回答
0

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

在您的情况下,我会尝试让服务器为我做这件事。无论如何,您从哪里获得图像?不是来自服务器?然后尝试发出 WS 请求,该请求将为您提供图像的正确部分。如果图像不是来自服务器,您仍然可以将其发送到服务器以仅取回您想要的图像部分。

于 2012-05-18T11:50:22.463 回答
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;
}

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

于 2012-05-18T12:02:48.703 回答