Forum Clubic

[JME]créer une image transparente

Toujours dans le cadre d’un projet J2ME, j’essaie de créer une image transparente pour pouvoir poser d’autres images par dessus.
J’utilise la methode Image.createImage(int width, int height)
Ceci me crée une image vide, mais lorsque que je l’affiche avec Graphics.drawImage(image, x,y, 0) elle n’est pas transparente, j’obtient un carré blanc.
Savez vous comment faire pour obtenir une image transaprente?
Il ya une methode createImage avec un parametre process alpha, peut etre que c’est ca, je ne sais pas a quoi ca correspond…
Merci!

MIDP 1.0 ne prévoit pas de transparence, la version 2 doit gérer le canal alpha comme java… 0 -> opaque, sinon pas niveau de 1 à 255 : 1 -> transparent, 255 -> opaque

Pour l’info, ce n’est pas l’image sur laquelle tu veux poser quelque chose qui doit être transparente mais les images que tu veux poser

Meilleur moyen d’être sûr pour la transparence : gérer ‘à la main’ avec setClip la transparence (seule méthode sûre pour MIDP 1.0)

OUi excuse moi je me sui mal exprimé, c’est l’image que je veu poser qui doi etre transparente.
Sinon je travaille sur MIDP 2.0.
La classe Image contient la methode suivante :
public static Image createRGBImage(int[] rgb,
int width,
int height,
boolean processAlpha)
j’ai vu aussi dans la doc que le tableau rgb devait avoir la taille de largeur* hauteur, donc apparemen ca contiendrai l’ensemble des pixels de l’image.

J’ai fait ca mais je n’ai pas encore une image transparente, juste un carré blanc :

Image image = null;

    int rgb[]= new int[largeur*hauteur];
    image.getRGB(rgb, 0, largeur, 0, 0, largeur, hauteur);
    
    
    try{
         
         image = Image.createRGBImage(rgb,largeur,hauteur, true);
    }
    catch (Exception e){}

Ton tableau doit contenir la valeur argb de chaque pixel

un int = valeur argb d’un pixel

Par rapport à ton exemple (1 pixel), cela donnerait

int[] rgb = new int[1];
rgb[0] = 1 << 24; // Alpha
rgb[0] += 255 << 16; // Rouge
rgb[0] += 255 << 8; // Vert
rgb[0] += 255; // Bleu

Soit -normalement- un pixel transparent qui aurait du prendre la couleur ‘blanc’

C’est bon ca marche merci !!

J’ai un autre probleme, je voudrais créer une image transparente, puis ecrire dedans .
Pour celà je voudrais faire monimage.getGraphics() puis utiliser la methode drawString du graphics.
Cependant l’image créer avec createRGBImage est immutable et la fonction getgraphics() n’est pas accessible sur une image immutable!
Savez vous comen je peu la rendre mutable?
SInon je peu créer une image normale mutable avec la methode createImage(), et la rendre transparente avec un autre procédé?
myself, tu m’as parlé de setClip, peux tu me preciser ce que c’est?
Merci :slight_smile:

J’ai essayé de faire ca :

int rgb[]= new int[largeur*hauteur];

    for(int i = 0; i &lt; rgb.length; i++){
                     
             rgb[i] = 0x00000000;
                     
             }    

Image img = Image.createImage(largeur, hauteur);
img.getGraphics().setClip(0, 0, largeur,hauteur);
img.getGraphics().drawRGB(rgb,0,largeur,0,0,largeur,hauteur,true);

Ca n’a pas rendu l’image transparente… Je vois plein de sites ou ils disent de rendre l’image transparente avec setClip mais jamais ils ne disent comment le faire, je dois surement mal m’y prendre …

En fait, tu mélanges 2 choses :

Le setClip, c’est :

  • pour pouvoir ne dessiner qu’une partie de ton image
  • Simuler la transparence (sans le sens visible, non visible)

Pour le premier point, cela permet par exemple de stocker plusieurs sprites dans une seule image, et de les afficher 1 par 1

Pour le second point, cela sert surtout pour MIDP 1.0 (Pas de gestion de l’alpha dans la norme), tu n’en a normalement pas besoin… L’idée est de connaître la forme de ton objet est d’utiliser setClip pour délimiter son contour… Ca peut paraître lourd (surtout si ton objet est circulaire), mais avec la petite taille des écrans de portables, c’est assez courant comme méthode

Pour les exemples, de mémoire, tu en trouveras sur developpez.com, je me souviens aussi d’une présentation très courte de Cocoasoft, accessible depuis le site de Sun. Il doit y avoir également un certain nombre de frameworks open-source pour développer des jeux sous J2ME (regarde du côté de sourceforge.net / freshmeat.net)

Au fait, pourquoi vouloir dessiner sur une image que tu as défini pixel par pixel? Pourquoi ne pas en créer une nouvelle avec les nouvelles données?

Merci pour tes reponses, en fait mon probleme c’est que dans notre projet on doit faire un jeu qui tourne a la fois sur pc et portable, donc je dois respecter l’implementation du noyau qui a été fait a la fois pour portable et pc.
On utilise des images vides tranparentes dans lesquelles on insere d’autres images, du texte etc …
Je sais que ce n’est pas la facon la plus facile mais on a plus le temps de recoder tout puisque le projet est a rendre pour mardi…
Finalement est ce que c’est possible de rendre une image de type mutable transparente avec setClip (puisqu’on ne peut rien inserer dans une image immutable)?

Je vais chercher les exemples que tu m’as donné , merci!

La réponse est non,

Voici un extrait de la doc j2me :

An immutable image may be created from a mutable image through the use of the createImage method. It is possible to create a mutable copy of an immutable image using a technique similar to the following:

    Image source; // the image to be copied    
    source = Image.createImage(...);    
    Image copy = Image
        .createImage(source.getWidth(), source.getHeight());        
    Graphics g = copy.getGraphics();    
    g.drawImage(source, 0, 0, TOP|LEFT);

Alpha Processing

Every pixel within a mutable image is always fully opaque. Immutable images may contain a combination of fully opaque pixels (alpha = 2bitdepth - 1), fully transparent pixels (alpha = 0), and semitransparent pixels (0 < alpha < 2bitdepth - 1), where bitdepth is the number of bits per sample in the source data.

Ce qui n’est a priori pas vraiment génant : Ton image ‘de fond’ n’a jamais besoin d’être transparente (par définition, il n’y a rien en dessous), c’est la seule qui doit impérativement être mutable (C’est en récupérant son Graphics que tu ‘dessines’ à l’écran)… Les images que tu colles dessus n’ont pas a être modifiables… puisque c’est l’image de fond que tu modifies

En pratique, je pense qu’il y a eu un problème de conception à la base… Le fait que J2ME ne laisse pas l’accès direct aux pixels n’a pas été pris en compte, non?

Ok c’est bien ce que je pensais, et oui je pense qu’il y a eu un probleme de conception …
Je vais essayer de me debrouiller , merci pour tes reponses.