В вашем коде piece может быть больше 8, поэтому вы получаете индекс за пределами bmps. Вам нужно переписать его так, чтобы самые правые и самые нижние части имели все лишние и не обязательно имели одинаковый размер.
Или, если вам нужно, чтобы они были одинакового размера, отбросьте лишние строки / столбцы. Чтобы убедиться, я бы сформулировал свой цикл for следующим образом:
for (int cellX = 0; cellX < 3; cellX++) {
int x = cellX * cellWidth;
for (int cellY = 0; cellY < 3; cellY++) {
int y = cellY * cellHeight;
// find the cellWidth/Height that doesn't overflow the original image
Bitmap b = // get the bitmap
bmps[piece] = b;
piece++;
}
}