2010-12-03 48 views
4

J'ai une image tamponnée de TYPE_4BYTE_ABGR imageType avec la transparence et je veux le convertir en TYPE_3BYTE_BGR BufferedImage. J'ai essayé de dessiner l'image TYPE_4BYTE_ABGR sur TYPE_3BYTE_BGR, mais cela a changé les couleurs.TYPE_4BYTE_ABGR à conversion TYPE_3BYTE_BGR

Le but est de mettre une image transparente sur fond blanc, car si l'on écrit simplement une image TYPE_4BYTE_AGBR dans .jpg, il obtient une zone noire transparente.

+0

Que voulez-vous dire par "couleurs changées"? Des couleurs? Seulement les pixels avec alpha? – Robert

+0

Il semble que les couleurs ont été inversées. Je pense qu'il a juste utilisé ABG comme BGR et ignoré le composant Red d'ABGR. –

+0

Pouvez-vous montrer le code que vous avez utilisé pour dessiner, qui a changé les couleurs? Je trouve cela très étrange + Je suis curieux. :-) – haraldK

Répondre

1

Ceci est le code dont vous avez besoin, vous devez mettre la même couleur avec 100% alpha dans une nouvelle image avec canal alpha.

// bufferedImage is your image. 
if (bufferedImage.getType() == BufferedImage.TYPE_3BYTE_BGR) { 
    BufferedImage bff = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); 
    for (int y = 0; y < bufferedImage.getHeight(); ++y) { 
     for (int x = 0; x < bufferedImage.getWidth(); ++x) { 
     int argb = bufferedImage.getRGB(x, y); 
     bff.setRGB(x, y, argb & 0xFF000000); // same color alpha 100% 
     } 
    } 
    return bff; 
} else { 
    return bufferedImage; 
} 

si vous voulez mettre une image transparente sur un fond blanc, vous devez en effet utiliser une nouvelle BufferedImage de type différent. Le code pour le faire est le suivant:

// bufferedImage is your image. 
if (bufferedImage.getType() == BufferedImage.TYPE_4BYTE_ABGR) { 
    for (int y = 0; y < bufferedImage.getHeight(); ++y) { 
     for (int x = 0; x < bufferedImage.getWidth(); ++x) { 
      int argb = bufferedImage.getRGB(x, y); 
      if((argb & 0x00FFFFFF) == 0x00FFFFFF){ //if the pixel is transparent 
       bufferedImage.setRGB(x, y, 0xFFFFFFFF); // white color. 
      } 
     } 
    } 
    return bufferedImage; 
}