2013-10-04 2 views
4

Я работаю с GeoTiff/PNG файлами, слишком большими для обработки в целом в моем коде.Декодирование определенных областей изображения в Bitmapfactory?

Есть ли возможность декодировать определенные области (например, заданные двумя координатами 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); 

} 
+0

Похоже, вы поняли. :) Интересно о инициализации Rect. Было ли это документировано где-то, или это кажется ошибкой, которую вы только что обнаружили в результате проб и ошибок? – kcoppock

ответ

2

Вы должны изучить BitmapRegionDecoder. Кажется, что он описывает именно тот вариант использования, который вы ищете.

2

Я не точно знаете, что вы подразумеваете под «Декодировать определенные области», но если вы можете расшифровать, на самом деле «скопируйте» определенные области растрового изображения, т вы можете сделать, это использовать холст, чтобы получить его, как показано ниже:

 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... 

Надеется, что это помогает ...

С уважением!