Я работаю над методом удаления прозрачных границ растрового изображения. Метод выглядит следующим образом:Удалить прозрачную привязку из 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 ... результат был еще более медленным.
Проблема заключается в том, что мне нужно выполнить операцию только один раз, а битмап большой (1920x1080). У меня нет возможности повторно использовать массив 2 МБ. – Spotlight
Используйте меньший массив и вызывайте метод пару раз. –
Я попробую это, спасибо – Spotlight