Depuis un bon moment je cherche à appliquer une transparence à un png, mais à ce que j'ai lu, Java ne gère pas ça directement.
A travers ce que j'ai pu lire sur ce forum et l'officiel, j'ai surtout trouvé deux choses:
Utiliser un BufferedImage avec un paramètre pour dire qu'on gère l'alpha
Utiliser une méthode qui traite les couleurs pour les modifier directement
J'ai essayé la seconde mais ça n'a pas l'air de bien fonctionner..
Voici la méthode spécifique:
public Image setTransparency(Image im, Color color)
{
final int markerRGB = color.getRGB() & 0x00FFFFFF;
ImageFilter filter = new RGBImageFilter()
{
public int filterRGB(int x, int y, int rgb)
{
if ((rgb & 0x00FFFFFF) == markerRGB)
return markerRGB;
else
return rgb;
}
};
ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}
Et pour finir, voilà les deux classes utiles
Mario.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
public class CaseMario
{
private Image img;
private Image[] imgList;
private int x, y;
public CaseMario()
{
imgList = new Image[2];
imgList[0] = Toolkit.getDefaultToolkit().getImage("img/marioG.png");
imgList[1] = Toolkit.getDefaultToolkit().getImage("img/marioD.png");
x = 13;
y = 5;
img = imgList[1]; // marioD au debut
}
public boolean isPassable()
{
return false;
}
public void setPos(char pos)
{
if (pos == 'G')
img = imgList[0];
else if (pos == 'D')
img = imgList[1];
}
public Image getImg()
{
return setTransparency(img, Color.white);
// return img;
}
public int getX()
{
return x;
}
public void setX(int x)
{
this.x = x;
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
public Image setTransparency(Image im, Color color)
{
final int markerRGB = color.getRGB() & 0x00FFFFFF;
ImageFilter filter = new RGBImageFilter()
{
public int filterRGB(int x, int y, int rgb)
{
if ((rgb & 0x00FFFFFF) == markerRGB)
return markerRGB;
else
return rgb;
}
};
ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(ip);
}
}
Jeu.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Jeu extends JPanel implements KeyListener
{
private Image[][] tab;
private CaseVide vide;
private CaseSol sol;
private CaseMario mario;
public Jeu()
{
setFocusable(true);
addKeyListener(this);
tab = new Image[15][15];
vide = new CaseVide();
sol = new CaseSol();
mario = new CaseMario();
initTab();
}
public void initTab()
{
for (int i = 0; i < tab.length; i++)
{
for (int j = 0; j < tab[0].length; j++)
{
tab[i][j] = vide.getImg();
tab[i][tab.length-1] = sol.getImg();
}
}
updateMario();
}
public void updateMario()
{
tab[mario.getY()][mario.getX()] = mario.getImg();
repaint();
}
public void delMario()
{
tab[mario.getY()][mario.getX()] = vide.getImg();
}
public boolean limiteOk(char dir)
{
if (dir == 'D')
return (mario.getY() < tab.length - 1);
else if (dir == 'G')
return (mario.getY() > 0);
return false;
}
public void paintComponent(Graphics g)
{
for (int i = 0; i < tab.length; i++)
{
for (int j = 0; j < tab[0].length; j++)
{
g.clearRect(i*16, j*16, 16, 16);
g.drawImage(tab[i][j], i*16, j*16, this);
}
}
}
public void keyPressed(KeyEvent e)
{
delMario();
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
{
if (limiteOk('D'))
{
mario.setPos('D');
mario.setY(mario.getY() + 1);
}
}
else if (e.getKeyCode() == KeyEvent.VK_LEFT)
{
if (limiteOk('G'))
{
mario.setPos('G');
mario.setY(mario.getY() - 1);
}
}
updateMario();
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
Avec ce code, les deux images (marioG.png & marioD.png) apparaissent avec le blanc autour
Hmm, tu ne peux pas utiliser directement un .png transparent au lieu de changer le blanc en transparent ? Ce serait quand même plus simple, et Java le gère parfaitement :
public class Test {
public static void main(String[] args) throws java.io.IOException {
javax.swing.JFrame jf = new javax.swing.JFrame();
jf.setSize(800,600);
jf.setContentPane(new TestPanel(javax.imageio.ImageIO.read(new java.io.File("test.png"))));
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jf.setVisible(true);
}
public static class TestPanel extends javax.swing.JPanel {
private final java.awt.Image img;
public TestPanel(java.awt.Image img) {
this.img = img;
}
protected void paintComponent(java.awt.Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null);
}
}
}
En utilisant une image test.png transparente, ça l'affiche bien en transparent.
PS : si tu dois afficher ton image souvent, vu que ça a l'air d'être pour un jeu, tu peux créer une "compatible image", qui sera plus rapide à afficher pour ta carte graphique :
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.