我在可绘制文件夹中有一个高分辨率图像(2588*1603).如果我使用下面的代码(1)为imageView设置它我没有得到OOM异常和按预期分配的图像:
public class MainActivity extends ActionBarActivity{
private ImageView mImageView;
int mImageHeight = 0;
int mImageWidth = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setScaleType(ScaleType.FIT_CENTER);
BitmapFactory.Options sizeOption = new BitmapFactory.Options();
sizeOption.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.a, sizeOption);
mImageHeight = sizeOption.outHeight;
mImageWidth = sizeOption.outWidth;
mImageView.post(new Runnable() {
@Override
public void run() {
try {
BitmapRegionDecoder bmpDecoder = BitmapRegionDecoder
.newInstance(getResources().openRawResource(R.drawable.a),true);
Rect rect = new Rect(0,0,mImageWidth, mImageHeight);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDensity = getResources().getDisplayMetrics().densityDpi;
Bitmap …Run Code Online (Sandbox Code Playgroud) android bitmap out-of-memory android-drawable bitmapregiondecoder
我正在处理GeoTiff/PNG太大而无法在代码中整体处理的文件。
有没有可能在bitmapfactory中解码文件的特定区域(例如,由两个x,y坐标指定)?尚未找到任何类似的东西http://developer.android.com/reference/android/graphics/BitmapFactory.html(Android开发者参考)。
谢谢!
有了kcoppock的提示,我已经设置了以下解决方案。
虽然我想知道为什么rect需要初始化Rect(left, bottom, right, top)而不是Rect(left, top, right, bottom)...
示例调用:
Bitmap myBitmap = loadBitmapRegion(context, R.drawable.heightmap,
0.08f, 0.32f, 0.13f, 0.27f);
Run Code Online (Sandbox Code Playgroud)
功能:
public static Bitmap loadBitmapRegion(
Context context, int resourceID,
float regionLeft, float regionTop,
float regionRight, float regionBottom) {
// Get input stream for resource
InputStream is = context.getResources().openRawResource(resourceID);
// Set options
BitmapFactory.Options opt = new BitmapFactory.Options();
//opt.inPreferredConfig = Bitmap.Config.ARGB_8888; //standard
// Create decoder
BitmapRegionDecoder decoder = null;
try { …Run Code Online (Sandbox Code Playgroud)