Bonjour
J'ai une image gif où j'aimerais pouvoir remplacer la palette de couleurs existante de l'image par une autre.
Dans ce cas d'exemple, remplacer le blanc par le rouge

Mon image est disponible ici : http://data.imagup.com/4/1113836851.gif
La palette de couleur ne contient que 2 couleurs : transparent et blanc

J'ai donc utilisé un filtre qui vérifie la couleur de chaque pixel et la remplace si nécessaire. Tout marche parfaitement de ce coté la.
En revanche j'ai un problème avec ma méthode imageToBufferedImage qui semble supprimer le fond transparent de l'image pour le remplacer par un fond noir

voici mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;
import java.io.File;
import javax.imageio.ImageIO;
 
public class TestPNG {
 
    public static void main(String[] args) throws Exception {
 
        File in = new File("bg.gif");
        BufferedImage source = ImageIO.read(in);
        int color = source.getRGB(0, 0);
 
        Image image = replaceColors(source, new Color(color), new Color(255, 0, 0));
 
        BufferedImage transparent = imageToBufferedImage(image);
 
        File out = new File("bg2.gif");
        ImageIO.write(transparent, "gif", out);
 
    }
 
    private static BufferedImage imageToBufferedImage(Image image) {
        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = bufferedImage.createGraphics();
        g2.setBackground(new Color(0, 0, 0, 0) );
        g2.clearRect(0, 0, 200, 40);
        g2.drawImage(image, 0, 0, null);
        g2.dispose();
        return bufferedImage;
    }
 
    public static Image replaceColors(BufferedImage im, final Color search, final Color replace) {
        ImageFilter filter = new RGBImageFilter() {
                public final int filterRGB(int x, int y, int rgb) {
                        if (rgb == search.getRGB()) {
                            return replace.getRGB();
                        } else {
                            return rgb;
                        }
                }
        };
        ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
        return Toolkit.getDefaultToolkit().createImage(ip);
    }
 
}