IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

TYPE_ARGB et BufferedImageOp : Incompatible?


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Par défaut TYPE_ARGB et BufferedImageOp : Incompatible?
    Bonjour,

    Lorsque j'essaye de filter une BufferedImage de type TYPE_INT_RGB tout fonctionne mais ave TYPE_INT_ARGB l'image présente un probléme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
    image.setRGB(0, 0, Color.black.getRGB());//(0,0,0)
    System.out.println(new Color(image.getRGB(0, 0)));
     
    short[] constant = new short[256];
     
    for (int i = 0; i < 256; i++) {
        constant[i] = (short) (42);
    }
    new LookupOp(new ShortLookupTable(0, constant),null)
            .filter(image, image);
     
    System.out.println(new Color(image.getRGB(0, 0)));//(42,42,42)
    Donc le résultat attendu serait tout les pixels à (42,42,42) (en rgb) mais ici le résultat est :java.awt.Color[r=42,g=42,b=0]

    Si vous pouviez m'aider à comprendre,merci d'avance.

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    J'ai souvent eu des problèmes avec les LookupOp avec les images dont le ColorModel est indexé où que le ColorModel a un canal Alpha.

    Du coup, j'utilisais la version suivante :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    /**
     * 
     */
    package millie.se.operator.lut;
     
    import java.awt.image.BufferedImage;
    import java.awt.image.IndexColorModel;
    import java.awt.image.LookupOp;
    import java.awt.image.ShortLookupTable;
     
    /**
     * @author florent
     *
     */
    public class LookupOperator {
     
    	short[][] mLutTable;
    	short[] sLutTable;
     
    	public LookupOperator(short[][] mLutTable) {
    		this.mLutTable = mLutTable;
    	}
    	public LookupOperator(short[] sLutTable) {
    		this.sLutTable = sLutTable;
    	}
     
    	public BufferedImage compute(BufferedImage input) {
    		BufferedImage output = new BufferedImage(input.getWidth(), input.getHeight(), input.getType());
    		compute(output, input);
    		return output;
    	}
     
    	public void compute(BufferedImage output, BufferedImage input) {
    		if(input.getWidth()!=output.getWidth()||input.getHeight()!=output.getHeight()) 
    			throw new IllegalArgumentException("Width and Height for input/output different");
    		int nbComponents= input.getColorModel().getNumComponents();
     
    		boolean hasAlpha = input.getColorModel().hasAlpha();
    		if(mLutTable==null) {
    			if(hasAlpha)
    				mLutTable = new short[][] {sLutTable, sLutTable, sLutTable, PredefinedLUT.getIdemLUT()};
    			else
    				mLutTable = new short[][] {sLutTable, sLutTable, sLutTable};
    		}
     
     
    		if(input.getColorModel() instanceof IndexColorModel) {
    			for(int y=0; y<output.getHeight(); y++)
    				for(int x=0; x<output.getWidth(); x++) {
    					int rgb = input.getRGB(x, y);
    					int iR;
    					int iG;
    					int iB;
     
    					if(nbComponents>=3) {
    						iR = mLutTable[0][(rgb >> 16) & 0xFF];
    						iG = mLutTable[1][(rgb >> 8) & 0xFF];
    						iB = mLutTable[2][rgb & 0xFF];
    					}
    					else {
    						iR = iG = iB = mLutTable[0][rgb&0xFF];
    					}
     
    					if(hasAlpha)
    						output.setRGB(x,y, (rgb>>24&0xFF)<<24 + (iR<<16)+(iG<<8)+iB);
    					else
    						output.setRGB(x,y, (iR<<16)+(iG<<8)+iB);
    				}
    		}
    		else {
    			LookupOp op = new LookupOp(new ShortLookupTable(0,mLutTable), null);
    			op.filter(input, output);
    		}
    	}
    }
    Que l'on trouve ici : http://subversion.developpez.com/pro...pOperator.java

    Le PredefinedLut est disponible ici : http://subversion.developpez.com/pro...efinedLUT.java

    Tu me diras si ça fonctionne.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Par défaut
    Ca fonctionne!

    (j'ai pris "PredefinedLUT" dans ton svn aussi pour que ca fonctionne)

    Alors,je regarde le code,et je te dit aprés.Parceque j'ai aussi des probléme avec ConvolveOp (même type de probléme).Alors soi je change et passe à JAI ou sinon j'essaye de comprendre ton projet (vraiment bien fait mais (et j'ai le même reflexe) pas commenté sur les parties "chaude" ou juste dire l'utilité d'une classe qui a un nom pas trés expressif (comme PredefinedLUT).

    Mais sinon (je le dirait jamais assez) j'adore ton projet.

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par buenol Voir le message
    Ca fonctionne!

    (j'ai pris "PredefinedLUT" dans ton svn aussi pour que ca fonctionne)

    Alors,je regarde le code,et je te dit aprés.Parceque j'ai aussi des probléme avec ConvolveOp (même type de probléme).Alors soi je change et passe à JAI ou sinon j'essaye de comprendre ton projet (vraiment bien fait mais (et j'ai le même reflexe) pas commenté sur les parties "chaude" ou juste dire l'utilité d'une classe qui a un nom pas trés expressif (comme PredefinedLUT).

    Mais sinon (je le dirait jamais assez) j'adore ton projet.
    PredefinedLUT me semble pourtant avoir un nom expressif. Ce sont des différentes LookUpTable prédefinies. Donc pour ne faire rien (utilisé pour les canaux alpha), pour augmenter le contraste, pour augmenter la luminosité etc. Il faudrait effectivement que je repasse sur tout pour essayer au moins de commenter toutes les entêtes de classes.



    Pour la convolution, je n'ai pas particulièrement noté de problème avec les canaux alpha. Le seul problème étant la non gestion des extensions de bords (BorderExtender). J'avais donc refait mon propre système inspiré de JAI.

    Tout ce qui a priori te serait utile se trouve dans Millie/millie.se (se comme Standard Edition)
    http://subversion.developpez.com/pro...e/se/operator/ . Mais il est reste des sections qui demandent à être optimisé (par exemple le HSLOperator qui est particulièrement gourmand)

    Concernant JAI, je n'ai jamais trop bien compris comment l'utiliser. De plus, le projet semble mort (aucune nouvelle depuis 2006/2007)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Par défaut
    Je publierai plus tard mes modifs de ton code (pour la GPL)

    ps:Sinon JAI.create(la commande,...) fait réelement bricolage mais ca a l'air d'être utilisé dans de gros projets....a voir

    sinon,et je devrais surement faire un autre post,mais quand j'applique un ConvolveOp sur une image creer ave gc.createCompatibleImage(w,h,Transparent.Translucent) ca me decompose l'image (je metrais un screen)

Discussions similaires

  1. [Javascript] Menu js incompatible FF + XHTML 1.0 trans..
    Par genova dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/11/2004, 13h08
  2. [TFileStream] : LoadFromStream et read : incompatible ?
    Par jmdeffet dans le forum Langage
    Réponses: 4
    Dernier message: 18/11/2004, 10h30
  3. [eclipse3.0][EclipseUML Omondo 3RC3 studio]incompatibles ???
    Par crapboulba dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 13/07/2004, 10h47
  4. [LG]Problême "types incompatibles"
    Par pierrOPSG dans le forum Langage
    Réponses: 7
    Dernier message: 23/04/2004, 21h34
  5. [Socket]Incompatible type ?
    Par Edouard Kaiser dans le forum Réseau
    Réponses: 30
    Dernier message: 21/02/2004, 20h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo