Декодировать определенные области изображения в Bitmapfactory?
Я работаю с GeoTiff/PNG
файлы слишком велики для обработки в целом в моем коде.
Есть ли возможность декодировать определенные области (например, заданные двумя координатами x,y) файла в bitmapfactory? Не нашли ничего похожего на 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);
Функция:
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 {
decoder = BitmapRegionDecoder.newInstance(is, false);
} catch (IOException e) {
e.printStackTrace();
}
// Get resource dimensions
int h = decoder.getHeight();
int w = decoder.getWidth();
// Set region to decode
Rect region = new Rect(
Math.round(regionLeft*w), Math.round(regionBottom*h),
Math.round(regionRight*w), Math.round(regionTop*h));
// Return bitmap
return decoder.decodeRegion(region, opt);
}
2 ответа
Вы должны посмотреть в BitmapRegionDecoder
, Кажется, он описывает именно тот случай использования, который вы ищете.
Я не знаю точно, что вы имеете в виду под "декодированием определенных областей", но если под декодированием вы подразумеваете "копирование" определенных областей растрового изображения, то вы можете использовать холст, чтобы получить его, как показано ниже:
Bitmap bmpWithArea = Bitmap.createBitmap(widthDesired, heightDesired, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmpWithArea);
Rect area = new Rect(arealeft, areatop, arearight, areabottom);
Rect actualSize = new Rect(0, 0, widthDesired, heightDesired);
canvas.drawBitmap(bitmapWithAreaYouWantToGet, area, actual, paintIfAny);
//And done, starting from this line "bmpWithArea" has the bmp that you wanted, you can assign it to ImageView and use it as regular bmp...
Надеюсь это поможет...
С уважением!