Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème transparence png

Avec ou sans alpha

    22 octobre 2010 à 17:31:47

    Bonjour à tous !

    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 :(

    Merci d'avance !

    Val'
    • Partager sur Facebook
    • Partager sur Twitter
    SiteWeb: ICI
      22 octobre 2010 à 18:23:01

      J'ai eu le meme problème et j'ai trouvé cette solution
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai tous les badges d'OpenClassrooms.
        22 octobre 2010 à 19:29:34

        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 :

        public static BufferedImage createCompatibleImage(BufferedImage img) {
        		GraphicsConfiguration gc = GraphicsEnvironment
        				.getLocalGraphicsEnvironment().getDefaultScreenDevice()
        				.getDefaultConfiguration();
        		if (img.getColorModel().equals(gc.getColorModel(img.getTransparency()))) {
        			return img;
        		}
        		BufferedImage imgCompat = gc.createCompatibleImage(
        				img.getWidth(null),
        				img.getHeight(null),
        				(img instanceof Transparency) ?
        					((Transparency) img).getTransparency() : Transparency.OPAQUE);
        		Graphics2D g = imgCompat.createGraphics();
        		if (imgCompat.getTransparency() != Transparency.OPAQUE) {
        			g.setComposite(AlphaComposite.Src);
        		}
        		g.drawImage(img, 0, 0, null);
        		g.dispose();
        		return imgCompat;
        	}
        

        • Partager sur Facebook
        • Partager sur Twitter

        Problème transparence png

        × 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.
        • Editeur
        • Markdown