2010-10-08 6 views
3

J'ai une application Android pour afficher une image sur une autre image, de sorte que la couleur blanche de la deuxième image soit transparente. Pour ce faire, j'ai utilisé deux ImageView s, avec l'image originale pour être recouvert comme bitmap1 et l'image à rendre transparent comme bitmap2. Quand je cours ceci, j'obtiens quelques exceptions à la méthode setPixel.Rendre une couleur spécifique dans le bitmap transparent

Voici mon code:

Bitmap bitmap2 = null; 
int width = imViewOverLay.getWidth(); 
int height = imViewOverLay.getHeight(); 
for(int x = 0; x < width; x++) 
{ 
    for(int y = 0; y < height; y++) 
    { 
     if(bitMap1.getPixel(x, y) == Color.WHITE) 
     { 
      bitmap2.setPixel(x, y, Color.TRANSPARENT); 
     } 
     else 
     { 
      bitmap2.setPixel(x, y, bitMap1.getPixel(x, y)); 
     } 
    } 
} 

imViewOverLay est le ImageView de l'image de superposition. Une idée de ce qui pourrait mal se passer dans le code ci-dessus?

+0

le code est bitmap bitmap2 = null; int width = imViewOverLay.getWidth(); int height = imViewOverLay.getHeight(); pour (int x = 0; x asifkt

+0

Essayez de modifier votre message pour ajouter le code au corps de la question ... – Frosty840

+1

Quelle exception obtenez-vous? Autre que le fait que dans l'exemple vous ne créez pas 'bitmap2'. – ChrisF

Répondre

2

L'erreur la plus évidente est que vous ne créez pas bitmap2 - sauf si vous n'avez pas publié tout le code bien sûr.

Vous le déclarez et le définissez sur null, mais ne faites rien d'autre jusqu'à ce que vous essayiez d'appeler bitmap2.setPixel.

+0

amis, j'ai résolu le problème. supprimé bitmap2 et mettre le bitmap1 mutable .. laissez-moi savoir est-il une méthode pour accélérer l'opération en boucle ?? dans mon application, il faut beaucoup de temps – asifkt

+0

quand je montre dans l'image ci-dessus .. il montre seulement le second (bitmap1), j'ai besoin de l'afficher sur un autre bitmap (bitmap3). quelqu'un plz m'aider avec quelques conseils. J'utilise imageview pour afficher l'image – asifkt

+0

@asifkt - par nécessité, vous devez faire une boucle sur chaque pixel de l'image, ce qui prendra un certain temps si vous avez une grande image. Réduisez la taille de l'image ou utilisez une image avec une palette de couleurs pour pouvoir modifier une seule valeur dans la palette. – ChrisF

2

je pense que vous devez faire mutable Loading a resource to a mutable bitmap

Je l'ai fait

BitmapFactory.Options bitopt=new BitmapFactory.Options(); 

bitopt.inMutable=true; 

mSnareBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.snare, bitopt); 

aussi, je l'ai trouvé i besoin de mettre alpha à quelque chose de moins de 255 pour elle de rendre l'image avec transparence Contexte.

par la façon dont
mPaint.setAlpha(250); 
canvas.drawBitmap(mSnareBitmap, 0, 30, mPaint); 

, avec du blanc comme couleur transparente est pas une bonne idée parce que vous obtiendrez des problèmes d'aliasing sur les bords de vos objets opaques. J'utilise le vert parce que mes images de superposition n'ont pas de vert (comme un écran vert dans les films) alors je peux enlever le vert à l'intérieur de la boucle et définir la valeur alpha en fonction de l'inverse de la valeur verte.

private void loadBitmapAndSetAlpha(int evtype, int id) { 

     BitmapFactory.Options bitopt=new BitmapFactory.Options(); 
     bitopt.inMutable=true; 
     mOverlayBitmap[evtype] = BitmapFactory.decodeResource(getResources(), id, bitopt); 
     Bitmap bm = mOverlayBitmap[evtype]; 

     int width = bm.getWidth(); 
     int height = bm.getHeight(); 
     for(int x = 0; x < width; x++) 
     { 
      for(int y = 0; y < height; y++) 
      { 
       int argb = bm.getPixel(x, y); 
       int green = (argb&0x0000ff00)>>8; 
       if(green>0) 
       { 
        int a = green; 
        a = (~green)&0xff; 
        argb &= 0x000000ff; // save only blue 
        argb |= a;  // put alpha back in 
        bm.setPixel(x, y, argb); 
       } 
      } 
     } 

    } 
Questions connexes