Декодировать определенные области изображения в 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...

Надеюсь это поможет...

С уважением!

Другие вопросы по тегам