2014-06-22 4 views
0

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

Répondre

1

Selon the docs vous pouvez passer un tableau à getPixels() que vous pouvez réutiliser plus tard. De cette façon, aucun GC ne devrait jamais arriver.

+0

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

+0

Utilisez un tableau plus petit et appelez la méthode plusieurs fois. –

+0

Je vais essayer, merci – Spotlight

Questions connexes