2013-08-11 2 views
1

Я пишу приложение для Android, которое обрабатывает большие растровые изображения, и нужно разбить растровое изображение на отдельные «плитки» и обработать каждую плиту индивидуально, прежде чем объединять их в конечном растровом изображении.Разделение и воссоединение растрового изображения

Любые подсказки о том, как это сделать? Я думал, что это будет достаточно просто с помощью createBitmap() и определения меньших фрагментов в нескольких вложенных циклах, но это не так просто, как я думал, потому что setPixels не работает, как я думал.

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

Есть ли более простые способы сделать это? Если нет, как мне это сделать, используя setPixels и createBitmap?

Мой код до сих пор:

 Bitmap finalImg = Bitmap.createBitmap(sourceImage.getWidth(), sourceImage.getHeight(), Bitmap.Config.ARGB_8888); //Bitmap to store the final, processed image 
     Bitmap tile = null; //Temporary Bitmap to store tiles 

     int tileDiameter = 500; //Width and height of tiles 
     int borderWidth = 5; //Amount of pixel overlap from other tiles 

     for (int y = 0 ; y < sourceImage.getHeight() ; y += tileDiameter) { 
      for (int x = 0 ; x < sourceImage.getWidth() ; x += tileDiameter) { 
       if (x == 0) { 
        if (y == 0) { 
         tile = Bitmap.createBitmap(sourceImage, x, y, (tileDiameter + borderWidth), (tileDiameter + borderWidth)); 
        } 
        else { 
         tile = Bitmap.createBitmap(sourceImage, x, (y - borderWidth), (tileDiameter + borderWidth), (tileDiameter + borderWidth)); 
        } 
       } 
       else { 
        if (y == 0) { 
         tile = Bitmap.createBitmap(sourceImage, (x - borderWidth), y, (tileDiameter + borderWidth), (tileDiameter + borderWidth)); 
        } 
        else { 
         tile = Bitmap.createBitmap(sourceImage, (x - borderWidth), (y - borderWidth), (tileDiameter + borderWidth), (tileDiameter + borderWidth)); 
        } 
       } 
       processor.process(tile); 
       //I need to attach this (processed) tile to it's correct location in finalImg. How!?? 
      } 
     } 

ответ

2

Вы можете использовать Canvas.drawBitmap рисовать обработанную плитку обратно в результат точечного рисунка. Используйте функцию, как это:

Canvas canvas = new Canvas(finalImg); 
canvas.drawBitmap(tile, 
        null, 
        new Rect(x, y, 
          x + tileDiameter, y + tileDiameter), 
        null); 

заметить также, что вы, вероятно, нужно, чтобы получить изменяемую копию tile так тот, который вы получите от Bitmap.createBitmap неизменен.

Смежные вопросы