2014-06-22 5 views
0

Я работаю над методом удаления прозрачных границ растрового изображения. Метод выглядит следующим образом:Удалить прозрачную привязку из Bitmap

private static final int STEP = 4;//Don't check all the pixel, only a sampling 

private Bitmap clipTransparent(Bitmap image) { 
    int x1, x2, y1, y2; 
    final int width = image.getWidth(); 
    final int height = image.getHeight(); 
    for (x1 = 0; x1 < width - 1; x1 += STEP) { 
     if (checkColumn(image, x1)) { 
      break; 
     } 
    } 
    x1 = Math.max(0, x1 - STEP); 
    for (x2 = width - 1; x2 > x1; x2 -= STEP) { 
     if (checkColumn(image, x2)) { 
      break; 
     } 
    } 
    x2 = Math.min(width, x2 + STEP); 

    for (y1 = 0; y1 < height - 1; y1 += STEP) { 
     if (checkRow(x1, x2, image, y1)) { 
      break; 
     } 
    } 
    y1 = Math.max(0, y1 - STEP); 

    for (y2 = height - 1; y2 > 0; y2 -= STEP) { 
     if (checkRow(x1, x2, image, y2)) { 
      break; 
     } 
    } 
    y2 = Math.min(height, y2 + STEP); 
    try { 
     image = Bitmap.createBitmap(image, x1, y1, x2 - x1, y2 - y1); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 
    return image; 
} 

private boolean checkColumn(Bitmap image, int x1) { 
    for (int y = 0; y < image.getHeight(); y += STEP) { 
     if (Color.alpha(image.getPixel(x1, y)) > 0) { 
      return true; 
     } 
    } 
    return false; 
} 

private boolean checkRow(int x1, int x2, Bitmap image, int y1) { 
    for (int x = x1; x < x2; x += STEP) { 
     if (Color.alpha(image.getPixel(x, y1)) > 0) { 
      return true; 
     } 
    } 
    return false; 
} 

Это прекрасно работает, но не так быстро, как хотелось бы. Узким местом кода является получение цвета пикселя.

Теперь я прочитал, что значение по телефону image.getPixel(x, y), но, глядя на исходном коде Android, getPixel проверяет индексы и делает другие вещи, которые замедляют код вниз (x>=0 && x<getWidth() && y>=0 && y<getHeight() && !isRecycled) ...

Есть ли способ доступ к данным пикселя без какой-либо проверки индекса или другого бесполезного материала (бесполезно в моем случае, конечно)?

PS: Я уже пытался использовать getPixels(), который возвращает массив int, содержащий все цвета. Но изображение является большим и выделяет все триггеры памяти GC ... результат был еще более медленным.

ответ

1

В соответствии с the docs вы можете передать массив в getPixels(), которые впоследствии можно использовать повторно. Таким образом, никакой GC не должен происходить.

+0

Проблема заключается в том, что мне нужно выполнить операцию только один раз, а битмап большой (1920x1080). У меня нет возможности повторно использовать массив 2 МБ. – Spotlight

+0

Используйте меньший массив и вызывайте метод пару раз. –

+0

Я попробую это, спасибо – Spotlight

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