Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : [Java] Déformation d'une image, redimension. [J2ME] [ Algorithme / Autre ] (Twub)

vendredi 2 mai 2008 à 16:57:48 | [Java] Déformation d'une image, redimension. [J2ME]

Twub

Bonjour a tous

Voila comme indiqué, je souhaite pouvoir déformer une image (dans mon cas c'est une texture), pour cela j'ai fais se code (Si vous avez des question hésitez pas ^^ ):

[code=java]
public void addTexture(Image _texture, Point _pGHaut, Point _pDHaut, int _yBas, boolean _transform)
    {

        if(_pGHaut.getX()>_pDHaut.getX())
        {
            Point BufPoint = _pDHaut;
            _pDHaut = _pGHaut;
            _pGHaut = BufPoint;
            _texture = Image.createImage(_texture, 0, 0, _texture.getWidth(), _texture.getHeight(), Sprite.TRANS_MIRROR);
        }
       
        if(_pGHaut.getY()>_yBas || _pDHaut.getY()>_yBas || _yBas > this.__height)
        {
            return;
        }
        else
        {
            if(_transform==true)
                _texture = Image.createImage(_texture, 0, 0, _texture.getWidth(), _texture.getHeight(), Sprite.TRANS_MIRROR);
           
            Image textDeforme = deformerImage(_texture, _pDHaut.getX()-_pGHaut.getX(), _yBas-_pGHaut.getY(), _yBas-_pDHaut.getY());
            int x = _pGHaut.getX();
            int y = 0;
           
            if(_pGHaut.getY()>_pDHaut.getY())
                y = _pDHaut.getY();
            else
                y = _pGHaut.getY();
           
            afficherImage(textDeforme, x, y);
        }
    }
   
    public Image deformerImage(Image _image, int _largeur, int _hauteur1, int _hauteur2)
    {
       
        int oldWidth = _image.getWidth();
        int oldHeight = _image.getHeight();   
        int[] oldImage = readImage(_image);
       
        int cas = 0;
        double dy = 0.0;   
        int air = 0;
        int larg = 0;
       
        if(_hauteur1>_hauteur2)
        {
            cas = 1;
            dy = ((double)_hauteur1-(double)_hauteur2)/(double)oldWidth;   
            air = oldWidth*_hauteur1;
            larg = (oldWidth*(_hauteur1-1));               
        }
        else
        {
            dy = ((double)_hauteur2-(double)_hauteur1)/(double)oldWidth;   
            air = oldWidth*_hauteur2;   
            larg = (oldWidth*(_hauteur2-1));
        }
       
        int lon = (oldWidth*(oldHeight-1));
        double newHauteur = (double)_hauteur1;
        int[] newImage = new int[air];
        int[] bufImTab = null;
        Image newIMAGE = null;
       
        for(int i=0; i<oldWidth; i++)
        {
            bufImTab = new int[oldHeight];
           
            //recupe tout une bande de hauteur
            for(int j=0;j<oldHeight;j++)
                bufImTab[j] = oldImage[i+lon -(j*oldWidth)];
           
            //On la redimensionne
            bufImTab = readImage(redimImage(Image.createRGBImage(bufImTab, 1, oldHeight, true), 1, (int)newHauteur));
           
            //On la place dans la nouvelle image
            for(int k=0;k<(int)newHauteur;k++)
            {
                if(newImage[k]==0)
                    newImage[k] = defineColor(0,0,0,0);
                   
                newImage[i+larg-(k*oldWidth)] = bufImTab[k];
            }
           
            if(cas == 0)
                newHauteur +=dy;
            else
                newHauteur -=dy;
       
        }
       
        if(cas==1)
        {
            return redimImage(Image.createRGBImage(newImage, oldWidth, _hauteur1, true),_largeur, _hauteur1);
        }
        else
        {
            return redimImage(Image.createRGBImage(newImage, oldWidth, _hauteur2, true),_largeur, _hauteur2);   
        }
           
    }
   
    public Image redimImage(Image _image, int _longueur, int _hauteur)
    {
        int sourceWidth = _image.getWidth();
        int sourceHeight = _image.getHeight();
        int redimWidth = _longueur;
        int redimHeight = _hauteur;
       
        int[] oldImage = readImage(_image);
        int[] newImage = new int[redimWidth*redimHeight];
        int compteur =0;
        Image redimImage = Image.createImage(redimWidth, redimHeight);
       
        if(redimWidth > __width)
            redimWidth = __width;
           
        if(redimHeight > __height)
            redimHeight = __height;
       
        if (redimHeight < 0)
            redimHeight = redimWidth * sourceHeight / sourceWidth;
       
        for (int y = 0; y < redimHeight; y++)
        {
            for (int x = 0; x < redimWidth; x++)
            {

                int dx = x * sourceWidth / redimWidth;
                int dy = y * sourceHeight / redimHeight;
                newImage[compteur] = oldImage[dx+dy*sourceWidth];
                compteur++;
            }
        }
      
        redimImage = Image.createRGBImage(newImage, redimWidth, redimHeight, true);
      
        return redimImage;
    }
   
    public void afficherImage(Image _image, int _x, int _y)
    {
   
        int[] imData = readImage(_image);
        int width = _image.getWidth();
        int height = _image.getHeight();
        int compteurX = 0;
        int compteurY = 0;
       
        for(int i=_y;i<(height+_y);i++)
        {
           
            for(int j=_x;j<(width+_x);j++)
            {
                if(0 <= j && j <= this.__width && 0 <= i && i <= this.__height)
                    this.__tabJeux[j+(i*this.__width)] = imData[compteurX+compteurY*width];
                compteurX++;
            }
           
            compteurX = 0;
            compteurY++;
        }
    }
   
    public int[] readImage(Image _image)
    {
        int[] argbdata = new int[_image.getWidth()*_image.getHeight()];
       
        _image.getRGB( argbdata, 0,  _image.getWidth(),  0,  0,  _image.getWidth(),  _image.getHeight());
       
        return argbdata;
    } 
[/code]

Je pense que mon algo n'est pas le plus optimisé...   j'aimerais beaucoup un coup de main pour sa

Merci ;)

Twub

vendredi 2 mai 2008 à 17:04:22 | Re : [Java] Déformation d'une image, redimension. [J2ME]

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
Salut,

As-tu jeté un oeil sur ma source DKS_Warp_Editor ?

Je pense qu'elle pourrait t'intéresser !
______________________________________
DarK Sidious

vendredi 2 mai 2008 à 17:10:54 | Re : [Java] Déformation d'une image, redimension. [J2ME]

Twub

Euh, je cherche mais je trouve pas ^^

Tu pourrais m'indiquer ou le télécharger stp ^^

merci a toi je vais y jeter un coup d'oeil

vendredi 2 mai 2008 à 17:20:39 | Re : [Java] Déformation d'une image, redimension. [J2ME]

Twub

En fait c'est bon j'ai trouvé ^^

Je regarde ce que t'as fais, mais la déformation que je fais est beaucoup moins poussé que la tienne.
Je travaille pour ma part sur le tableau de pixel de l'image que je veux déformer, et mes actions reste assez simple, mais il me semble que j'ai du faire 2/3 erreurs d'algorithme. non?

En fait je cherche a optimiser mon code, et l'améliorer bien sur
Je vais regarder ce que tu as fais plus en détail, mais si jamais tu as une idée pour mon code, n'hésite pas ;)

Merci
Twub

vendredi 2 mai 2008 à 17:38:23 | Re : [Java] Déformation d'une image, redimension. [J2ME]

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
Salut,

Ben disont que j'ai pas vraiment regardé ton algo, vu le nombre de ligne, j'ai la flemme de voir à quoi il sert. Explique moi quel type de transformation du veux faire.

L'API que j'utilise pour faire le warp (JAI) permet de manipuler les images de façon très efficace (il y a un wrapper pour des accès système sous forme de dll, ce qui optimise les performances), et c'est pensé pour faire des manipulations de pixels, ou d'images de manière efficace.
______________________________________
DarK Sidious

lundi 5 mai 2008 à 09:40:02 | Re : [Java] Déformation d'une image, redimension. [J2ME]

Twub

Bonjour,

en fait le bout de code permet d'aprés une image existante (texture pour mon cas) de la transformer, c'est a dire je lui donne le point gauche en haut(x et y), le point droit en haut (x et y) et le y du bas, donc l'image va s'allonger du coté gauche ou droit en hauteur.
Le warp semble trés complet seulement mon programme qui utilise en autre la déformation de ma texture doit etre utilisable sur téléphone portable, je ne peux donc pas utiliser une API tel que JAI qui n'est présente sur aucun téléphone.

Merci en tout cas de te pencher sur mon probleme ^^

Twub



lundi 5 mai 2008 à 12:42:47 | Re : [Java] Déformation d'une image, redimension. [J2ME]

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
Salut,

Ok, c'est un simple étirrement ? Ettirer la taille de la texture ?

Tu as les fonctions standard de Graphics2D pour faire cà.

Si c'est étirer dans une direction, c'est le share (toujours de Graphics2D) qu'il faut utiliser (pas sûr de la nomenclature).
______________________________________
DarK Sidious

lundi 5 mai 2008 à 14:26:15 | Re : [Java] Déformation d'une image, redimension. [J2ME]

Twub

Bonjour,

Pas exactement, mon image gardera une base plate, mais la hauteur de gauche et de droite pourra varier, former un trapeze avec une image d'origine rectangulaire.

Autre soucis, je suis sous j2me et je ne possede pas cette librairie la...
Je fais donc de telle fonction moi meme.

Mais la je bloque, je suis sur que je pourrais mieux faire, mais comment? ^^


Twub




vendredi 9 mai 2008 à 11:58:51 | Re : [Java] Déformation d'une image, redimension. [J2ME]

Twub

Bonjour,

Je pense avoir résolu mon probleme merci de tes infos ;)

A plus,
Twub



Cette discussion est classé dans : int, image, texture, if, oldwidth


Répondre à ce message

Sujets en rapport avec ce message

Pb de chargement de jpg sur une BufferedImage [ par shivan ] Alors je vous explique vite fait, j'ai une classe devant gérer des images en leur rajoutant du texte et des fichiers jpg a volonté. le constructeur ch image en texture [ par kaliel ] bonjour,j'ai trouvé ici ou là comment mettre un image en fond d'un jlabel ou d'un jpanel et que ceux ci prennent les dimensions de l'image. Puis si je Resolution d'impression [ par Dobel ] encore un pb d'imression lolmais il est serienx celui-là ;-(j'étais en train de faire une joulie boîte pour configurer l' impression d'un JPanel : tai Grand débutant cherche aide sur du BufferedImage [ par mageti ] Salut à tous,Je suis débutant : ça fait 20 jours que je fais du java.Voilà mon problème: Une classe, dont le code-source est ci-après, est appelé par probleme de raffraichissement d'image [ par Azdruyel ] Bonjour a tous!Aujourd'hui,un nouveau jour, et donc un nouveau probleme!!!Alors voila, mon truc c'est que j'affiche en fond dans un JPanel une image ( image arriere plan [ par Skyffer3 ] Salut a tousVoila j'ai ce programme et il me faudrait un arriere plan, j'ai essaye comme il faut faire avec la methode public void paint, mais ca ne m [Afficher une image dans un JLabel] [ par Bouki ] slt, voila g un pb, j'essaye de faire un editeur de carte seulement voila je suis bloqué, j'arrive bien a afficher les images mais seulement la derni redimensionnement de JPEG et EXIF [ par Neo3004 ] Je cherche une solution à un problème depuis un moment : <font face="Arial" si Image et traitement [ par suckwindow ] Bonjour a tous, je developpe dans le cadre d'un petit projet, un logiciel de traitement d'image d'electrophorese 2D. J'ai opte pour un tye de fonction dessiner une image [ par qhhu ] Salut J'ai un probleme pour dessiner une image avec java.awt.Graphics2D ...J'utilise la méthode  public abstract boolean drawImage(Image im, int x, in


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.