Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 13 Jan 2009, 11:51 Message non corrigé | |
|
Erf, est ce que les sprites en .gif gèrent la transparence ?
Car moi, j'ai télécharger un sprite, et quand j'essaye de mettre la couleur de font en transparent, il me la met toujours en opaque, et j'ai remarqué cela car quand je veut mettre le fond de l'image en blanc, à l'aide d'un filtre rgb, même si je met la valeur de alpha à zéro, ça me l'affiche en blanc, alors si quelqu'un connais un format d'image qui gère la transparence svp...
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 13 Jan 2009, 13:19 Message non corrigé | |
|
Purée, j'arrive pas à faire un fond transparent avec gimp!
Télécharger des sprites c'est bien, mais pouvoir rendre le fond transparent ce serait encore mieux.
Mais bon, même quand je le fais avec Java, le fond est blanc et pas transparent, même si je met la valeur de alpha à zéro.
J'avoue de je galère un peu là au niveau de la transparence, j'arrive à filtrer les images en changeant la couleur des pixels, mais pas à rendre transparent.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 13 Jan 2009, 14:32 Message non corrigé | |
|
Ha bin non je suis bête j'ai réussi, j'ai changé la couleur de fond, et la couleur de fond de l'image a changée aussi,donc ça veut dire que le fond de l'aimge est transparent, tin je suis trop con. J'ai cru que ça ne marchait pas, mais si ça marche!
Je sais pas ce qui m'a prit de penser que ça marche pas, sans doute parce que le sprite que j'ai télécharger est un peu mal fait parce que les images sont pas de même taille alors du coup bah, il les enchaînes pas bien.
N'empêche c'est cool car il y a une classe toute faîtes pour récupérer les valeurs rgba d'un pixels.
Et il y a une méthode toute faîtes d'une classe à redéfinir pour changer la couleur des points d'une image.
Comme ça que j'ai pus mettre facilement le fond de l'image transparent, il suffit de vérifier si les valeurs rgb des pixels sur l'image correspond aux valeurs rgb de la couleur de fond, et si oui, rendre les pixels transparent.
J'ai envie de mettre le code pour voir à quel point c'est simple, sérieusement, ça devrai donner envie à certain de faire du Java.
Car avec la SDL, je saurai pas le faire moi ça, déjà, je ne sais pas comment récupérer les valeurs rgba d'un point d'une image avec la SDL, et encore moi les remplacer.
Animation d'un gif en Java, et rendu avec fond des frames transparent :
package edition;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ColorModel;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageProducer;
import java.awt.image.IndexColorModel;
import java.awt.image.PixelGrabber;
import java.awt.image.RGBImageFilter;
import java.util.ArrayList;
import java.util.TimerTask;
import java.util.Timer;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Fenetre extends JFrame implements KeyListener {
private static final String titreFenetre = "Edition de terrains en 2D";
private static final int largeurFenetre = 500;
private static final int hauteurFenetre = 500;
private static final int tailleImage = 70;
private int px, py;
private int decalage, currentFrame;
private Image[] frames1 = new Image[14];
private Graphics bufferGraphique;
private Image bufferImage;
private Terrain2D terrain;
private boolean anime;
private Thread animationFrames;
public Fenetre (Terrain2D terrain) {
super(titreFenetre);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize (largeurFenetre, hauteurFenetre);
px = (int) (largeurFenetre / 2);
decalage = 0;
setBackground(new Color (0, 150, 255));
this.terrain = terrain;
setVisible (true);
bufferImage = createImage(largeurFenetre, hauteurFenetre);
bufferGraphique = bufferImage.getGraphics();
Toolkit toolkit = Toolkit.getDefaultToolkit();
MediaTracker tracker = new MediaTracker (this);
String imgEmpl = "RoronoaZoro.gif";
chargerImage (imgEmpl, toolkit, tracker);
tracerTerrain(terrain);
anime = false;
currentFrame = 0;
dessinerFrame ();
addKeyListener (this);
}
public void chargerImage (String imgEmpl, Toolkit toolkit, MediaTracker tracker) {
Image animation1 = toolkit.getImage(imgEmpl);
Image filtre1 = toolkit.createImage(new FilteredImageSource(animation1.getSource(), new ImageTransp ()));
for (int i = 0; i < 14; i++) {
frames1[i] = toolkit.createImage (new FilteredImageSource (filtre1.getSource(), new CropImageFilter (i * 38+8, 10, 50, 70)));
tracker.addImage(frames1[i], i);
}
try {
tracker.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (tracker.isErrorAny())
System.out.println("Erreur pendant le chargement des images");
}
public void tracerTerrain (Terrain2D terrain) {
int i = 0;
ArrayList<Point> lp = terrain.getPoints();
while (i < lp.size() - 1) {
Point a = lp.get(i);
Point b = lp.get(i+1);
bufferGraphique.drawLine(a.x - decalage, a.y, b.x - decalage, b.y);
i++;
}
repaint ();
}
public void clear () {
bufferGraphique.clearRect(0, 0, largeurFenetre, hauteurFenetre);
tracerTerrain(terrain);
}
public void dessinerFrame () {
if (currentFrame > 13 || !anime)
currentFrame = 0;
Image frame;
frame = frames1[currentFrame];
ArrayList<Point> lp = terrain.getPoints();
Point p1, p2;
int i = -1;
do {
i++;
p1 = lp.get(i);
p2 = lp.get(i+1);
} while ((p2.x - decalage) < (px - decalage) + tailleImage / 2);
double rapport = (double) ((px - decalage + tailleImage / 2) - (p1.x - decalage)) / (double) ((p2.x - decalage) - (p1.x - decalage));
if (p1.y > p2.y) {
double distance = p2.y - p1.y;
py = (p1.y - tailleImage) + (int) (distance * rapport);
} else if (p1.y < p2.y) {
double distance = p1.y - p2.y;
py = (p1.y - tailleImage) - (int) (distance * rapport);
}
bufferGraphique.drawImage(frame, px - decalage, py, this);
repaint ();
}
public void paint(Graphics g) {
g.drawImage(bufferImage, 0, 0, largeurFenetre, hauteurFenetre, this);
}
public void upDate (Graphics g) {
paint (g);
}
public static void main (String[] args) {
Terrain2D t2d = new Terrain2D (1000, 0, 250, 1000, 200);
t2d.addPente(new Point (0, 250), 45, 100);
t2d.addPente (new Point (200, 250), -50, 70);
Fenetre fen = new Fenetre (t2d);
fen.tracerTerrain(t2d);
}
@Override
public void keyPressed(KeyEvent e) {
clear ();
Point dernier = terrain.getDernier();
Point premier = terrain.getPremier();
animationFrames = new Thread (new StartAnimation ());
// TODO Auto-generated method stub
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
px += 5;
if (px + tailleImage + 10 > dernier.x)
px = dernier.x - tailleImage - 10;
if (px > largeurFenetre /2)
decalage += 5;
if (px > dernier.x - largeurFenetre / 2)
decalage = dernier.x - largeurFenetre;
} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
px -= 5;
if (px < premier.x + 10)
px = premier.x + 10;
if (px < dernier.x - largeurFenetre / 2)
decalage -= 5;
if (decalage < 0)
decalage = 0;
}
anime = true;
animationFrames.start();
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
animationFrames.stop();
anime = false;
clear ();
dessinerFrame ();
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
private class StartAnimation extends Thread {
public void run () {
try {
animationFrames.sleep(70);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
currentFrame++;
dessinerFrame ();
}
}
public class ImageTransp extends RGBImageFilter {
public ImageTransp () {
canFilterIndexColorModel = true;
//Applique un filtre sur tout les points de l'image.
}
public int filterRGB(int x, int y, int rgb) {
ColorModel cm = ColorModel.getRGBdefault();
//Récupère le modèle utilisé pour coder un pixels. (Sur 4 bits par défaut, modèle rgba)
int alpha = cm.getAlpha(rgb); //Récupération de la valeur rgba d'un pixel sur l'image.
int rouge = cm.getRed(rgb);
int vert = cm.getGreen(rgb);
int bleu = cm.getBlue(rgb);
if (rouge == 0 && vert == 206 && bleu == 255) { //Si ce pixel à la même couleur que la couleur de fond, on le rend transparent.
alpha = 0 & 0xFF; //Valeur de alpha 0 si transparent, 255 si opaque.
return alpha | rouge | vert | bleu; Renvoie des valeurs rgba pour que la jvm puisse tracer la nouvelle image filtrée.
} else
return rgb;
//Sinon, bah on ne modifie rien.
}
}
}
PS : Un filtre est une nouvelle image créé sur base d'une autre, il y a deux filtre en Java CropImageFilter qui permet de récupérer une partie d'une image à partir d'une grande image chargée dans le programme et RGBImageFilter qui permet de récupérer une image dont les valeurs RGBA ont été modifiées par rapport à l'image originale!
Ca te donne pas envie de faire du Java ça David ?
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|