我有一个图像非常大的文件:例如9000x9000。
我无法在内存中加载Bitmap,因为堆大小。但我只需要显示这个位图的一小部分,例如rect width = 100-200和height = 200-400(子位图的结果大小= 100x200)
如何从文件中检索此位图?
注意:我不想在100x200图像中丢失质量
由于
答案 0 :(得分:14)
可能有解决方案吗?
它适用于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;
}
我不确定,但这可能会给你一些想法