我有一个图像非常大的文件:例如 9000x9000。
由于堆大小,我无法将位图加载到内存中。但我只需要显示这个位图的一小部分,例如矩形宽度=100-200 和高度=200-400(子位图的大小=100x200)
如何从文件中检索此位图?
注意:我不想损失 100x200 图像的质量
谢谢
有没有可能解决这个问题?
它应该适用于 API10 及更高版本...
用法:
BitmapRegionDecoder.newInstance(...).decodeRegion(...)
可以使用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 及更高版本。
我认为您可以使用允许您指定要解码的 Rect 的 BitmapFactory 方法。
public static Bitmap decodeStream (InputStream is, Rect outPadding, BitmapFactory.Options opts)
试试这个代码:
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);
}
我不认为你可以。即使在 PC 上,我也看不出如何在不加载整个图像的情况下做到这一点:大多数图像格式(例如 PNG)都压缩了像素数据,因此您至少需要解压缩 IDAT 块才能开始执行此操作其他任何东西,基本上都会解码整个图像。
在您的情况下,我会尝试让服务器为我做这件事。无论如何,您从哪里获得图像?不是来自服务器?然后尝试发出 WS 请求,该请求将为您提供图像的正确部分。如果图像不是来自服务器,您仍然可以将其发送到服务器以仅取回您想要的图像部分。
试试这个代码:
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;
}
我不确定,但这可能会给你一些想法