Что не так с этим Java-кодом для Android? - PullRequest
1 голос
/ 31 декабря 2010

Я написал этот фрагмент кода, чтобы разбить изображение на 9 частей, и это дает мне ошибку во время выполнения. В LogCat нет ошибки, и я застрял. Ошибка возникает в строке 7 снизу (Bitmap.createBitmap (...);).

public Bitmap[] getPieces(Bitmap bmp) {
        Bitmap[] bmps = new Bitmap[9];

        int width = bmp.getWidth();
        int height = bmp.getHeight();

        int rows = 3;
        int cols = 3;

        int cellHeight = height / rows;
        int cellWidth = width / cols;

        int piece = 0;

        for (int x = 0; x <= width; x += cellWidth) {
            for (int y = 0; y <= height; y += cellHeight) {
                Bitmap b = Bitmap.createBitmap(bmp, x, y, cellWidth,
                        cellHeight, null, false);
                bmps[piece] = b;
                piece++;
            }
        }

        return bmps;
    }

Ответы [ 3 ]

4 голосов
/ 31 декабря 2010

Это ограничение платформы Android, которое не выдает правильное сообщение об ошибке. Идеальным решением было бы заключить ваш код в блок try / catch и записать исключение в консоль и соответственно исправить код, но использовать его только для целей отладки.

try {
    // Code
}
catch (Exception e) {
    Log.e("ERROR", "ERROR IN CODE:"+e.toString());
}

Вышеприведенный код извлечен отсюда:

http://moazzam -khan.com / блог /? Р = 41

2 голосов
/ 31 декабря 2010

Вместо

    for (int x = 0; x <= width; x += cellWidth) {
        for (int y = 0; y <= height; y += cellHeight) {

используйте

    for (int x = 0; x+cellWidth < width; x += cellWidth) {
        for (int y = 0; y+cellHeight < height; y += cellHeight) {

, чтобы избежать выборки частей изображения, которые (хотя бы частично) не существуют.

0 голосов
/ 31 декабря 2010

В вашем коде 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++;
        }
   }
...