Je travaille sur une méthode pour supprimer les limites transparentes d'un bitmap. La méthode ressemble à ceci:Supprimer la liaison transparente de 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;
}
Cela fonctionne très bien, mais pas aussi rapidement que je le voudrais. Le goulot d'étranglement du code est d'obtenir la couleur d'un pixel.
Maintenant, je lis que la valeur en appelant image.getPixel(x, y)
, mais en regardant le code source d'Android, getPixel
vérifie les index et fait d'autres choses qui ralentit le code vers le bas (x>=0 && x<getWidth() && y>=0 && y<getHeight() && !isRecycled
) ...
est-il un moyen de accéder aux données de pixel sans aucun contrôle d'index ou d'autres choses inutiles (inutile dans mon cas bien sûr)? PS: J'ai déjà essayé d'utiliser getPixels() qui retourne un tableau int contenant toutes les couleurs. Mais l'image est grande et allouer toute la mémoire déclenche un GC ... le résultat était une méthode encore plus lente
Le problème est que j'ai besoin de faire l'opération une seule fois, et le bitmap est grand (1920x1080). Je n'ai aucun moyen de réutiliser un tableau de 2 Mo – Spotlight
Utilisez un tableau plus petit et appelez la méthode plusieurs fois. –
Je vais essayer, merci – Spotlight