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

Millie Discussion :

[Suggestion] Ajout Plugin Lanczos Resampling


Sujet :

Millie

  1. #1
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut [Suggestion] Ajout Plugin Lanczos Resampling
    Algo que j'utilise souvent pour réduire les dimensions des images, surtout quand celles-ci contiennent des détails ou du texte.

    Exemple : redimensionnement d'une copie d'écran

    a gauche: interpolation bicubique 65%
    a droite: Lanczos resampling 65%


    Code java : 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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    package millie.plugins.core.transform;
     
    import java.awt.image.BufferedImage;
    import java.util.Arrays;
     
    import millie.plugins.GenericPluginFilter;
    import millie.plugins.parameters.IntSliderParameter;
     
     
    /**
     * Lanczos resampling of an image
     * 
     * @author Xavier Philippeau
     */
    public class Resample extends GenericPluginFilter {
     
    	/**
             * inner class: Kernel
             */
    	private class Kernel1D {
    		int size, normalizer, coefs[];
    		Kernel1D(int size,  int[] c, int n) {
    			this.size=size;
    			this.coefs=c;
    			this.normalizer=n;
    		}
    	}
     
    	private int minsupport = 0;
     
    	public Resample() {
    		setPluginName("Resampling");
    		setLongProcessing(true);
    		addParameter(new IntSliderParameter("scalex",  "Redimensionnement horizontal (%)", 1,200,100));
    		addParameter(new IntSliderParameter("scaley",  "Redimensionnement vertical (%)",   1,200,100));
    		addParameter(new IntSliderParameter("support", "taille minimum du support",        1,5,1));
    	}
     
    	// ---------------------------------------------------------------------------
    	//                      GenericPluginFilter interface
    	// ---------------------------------------------------------------------------
     
    	@Override
    	public BufferedImage filter() throws Exception {
    		BufferedImage input = getInputImage();
    		double xfactor = getIntValue("scalex")*0.01;
    		double yfactor = getIntValue("scaley")*0.01;
    		this.minsupport = getIntValue("support")*2+1;
     
    		// reset kernel cache
    		this.kernelsCacheX = new Kernel1D[100]; 
    		this.kernelsCacheY = new Kernel1D[100]; 
     
    		// create empty output image
    		int width = input.getWidth();
    		int height = input.getHeight();
    		int newwidth  = (int)(0.5+width*xfactor);
    		int newheight = (int)(0.5+height*yfactor);
    		BufferedImage output = new BufferedImage(newwidth, newheight, BufferedImage.TYPE_INT_ARGB); 
     
    		// for each pixel in output image
    		for (int y=0; y<newheight; y++) {
    			for (int x=0; x<newwidth; x++) {
     
    				// ideal sample point in the source image
    				double xo = x/xfactor;
    				double yo = y/yfactor;
     
    				// separate integer part and fractionnal part
    				int x_int = (int)xo; double x_frac = xo - x_int;
    				int y_int = (int)yo; double y_frac = yo - y_int;
     
    				// get/compute resampling Kernels 
    				Kernel1D kx = getKernelX(xfactor, x_frac);
    				Kernel1D ky = getKernelY(yfactor, y_frac);
     
    				// compute resampled value
    				int rgb = fastconvolve(input, x_int, y_int, kx, ky);
     
    				// set to output image
    				output.setRGB(x,y,rgb);
    			}
    		}
     
    		return output;
    	}
     
    	// ---------------------------------------------------------------------------
    	//                    Compute and store Lanczos kernels
    	// ---------------------------------------------------------------------------
     
    	private Kernel1D[] kernelsCacheX = null; 
    	private Kernel1D[] kernelsCacheY = null; 
     
    	/**
             *  Lanczos function: sinc(d.pi)*sinc(d.pi/support)
             * 
             * @param support,d input parameters
             * @return value of the function
             */
    	private double lanczos(double support, double d) {
    		if (d==0) return 1.0;
    		if (d>=support) return 0.0;
    		double t = d * Math.PI;
    		return support*Math.sin(t)*Math.sin(t/support)/(t*t);
    	}
     
    	/**
             * Compute a Lanczos resampling kernel
             * 
             * @param scale scale to apply on the original image 
             * @param frac fractionnal part of ideal sample point
             * @return the Lanczos resampling kernel
             */
    	private Kernel1D precompute(double scale, double frac) {
     
    		// compute support size = how many source pixels for 1 sampled pixel ?
    		int support=(int)(1+1.0/scale);
    		// minimum support
    		if (support<minsupport) support=minsupport;
    		// support size must be odd
    		if (support%2==0) support++;
     
    		// scale limiter (minimum unit = 1 pixel)
    		scale = Math.min(scale, 1.0);
     
    		// construct an empty kernel
    		Kernel1D kernel = new Kernel1D(support,new int[support],0);
     
    		int i=0;
    		int halfwindow = support/2;
    		for(int dx=-halfwindow;dx<=halfwindow;dx++) {
     
    			// ideal sample points (in the source image)
    			double x = scale*(dx+frac);
     
    			// corresponding weight (=contribution) of closest source pixel
    			double coef = lanczos( halfwindow , x );
     
    			// store to kernel
    			int c = (int)(1000*coef+0.5);
    			kernel.coefs[i++]  = c; 
    			kernel.normalizer += c;
    		}
     
    		return kernel;
    	}
     
    	private Kernel1D getKernel(Kernel1D[] cache,double scale, double frac) {
    		int kid = (int)(frac*100);
    		Kernel1D k = cache[kid];
    		if(k==null) {
    			k = precompute(scale, frac);
    			cache[kid]=k;
    			if (k.size>tmpbuffer_r.length) tmpbuffer_r = new int[k.size];
    			if (k.size>tmpbuffer_g.length) tmpbuffer_g = new int[k.size];
    			if (k.size>tmpbuffer_b.length) tmpbuffer_b = new int[k.size];
    		}
    		return k;
    	}
    	private Kernel1D getKernelX(double scale, double frac) {
    		return getKernel(kernelsCacheX,scale,frac);
    	}
    	private Kernel1D getKernelY(double scale, double frac) {
    		return getKernel(kernelsCacheY,scale,frac);
    	}
     
    	// ---------------------------------------------------------------------------
    	//              Fast 2D convolution (separation of the 2 kernels)
    	// ---------------------------------------------------------------------------
     
    	// temporary buffer used for convolution
    	private int[] tmpbuffer_r = new int[0];
    	private int[] tmpbuffer_g = new int[0];
    	private int[] tmpbuffer_b = new int[0];
     
    	/**
             * convolve an image with a kernel for one pixel
             * 
             * @param c input image
             * @param x,y coords of the pixel
             * @param kernelx,kernely kernels to use
             * @return new value of the pixel
             */
    	private int fastconvolve(BufferedImage img, int x, int y, Kernel1D kernelx, Kernel1D kernely) {
    		int halfwindowy = kernely.size/2; // assume a odd size
    		int halfwindowx = kernelx.size/2; // assume a odd size
     
    		// empty tmpbuffer
    		Arrays.fill(tmpbuffer_r, 0);
    		Arrays.fill(tmpbuffer_g, 0);
    		Arrays.fill(tmpbuffer_b, 0);
     
    		// pass 1 : horizontal convolution of image lines aree stored in tmpbuffer
    		for(int dy=-halfwindowy;dy<=halfwindowy;dy++) {
    			if (y+dy<0 || y+dy>=img.getHeight()) continue;
    			for(int dx=-halfwindowx;dx<=halfwindowx;dx++) {
    				if (x+dx<0 || x+dx>=img.getWidth()) continue;
     
    				int rgb = img.getRGB(x+dx, y+dy);
    				int r = (rgb>>16)&0xFF;
    				int g = (rgb>>8)&0xFF;
    				int b = (rgb)&0xFF;
     
    				tmpbuffer_r[halfwindowy+dy] += kernelx.coefs[halfwindowx-dx] * r;
    				tmpbuffer_g[halfwindowy+dy] += kernelx.coefs[halfwindowx-dx] * g;
    				tmpbuffer_b[halfwindowy+dy] += kernelx.coefs[halfwindowx-dx] * b;
    			}
    		}
     
    		// pass 2 : vertical convolution of values stored in tmpbuffer
    		double rc=0,gc=0,bc=0;
    		for(int dy=-halfwindowy;dy<=halfwindowy;dy++) {
    			rc += kernely.coefs[halfwindowy-dy] * tmpbuffer_r[halfwindowy+dy];
    			gc += kernely.coefs[halfwindowy-dy] * tmpbuffer_g[halfwindowy+dy];
    			bc += kernely.coefs[halfwindowy-dy] * tmpbuffer_b[halfwindowy+dy];
    		}
     
    		// normalization
    		double norm = kernelx.normalizer*kernely.normalizer;
    		rc/=norm; gc/=norm; bc/=norm;
     
    		// return in argb format
    		int r = (int)Math.min(255,Math.max(0,rc+0.5));
    		int g = (int)Math.min(255,Math.max(0,gc+0.5));
    		int b = (int)Math.min(255,Math.max(0,bc+0.5));
    		return 0xFF000000 + (r<<16) + (g<<8) + b;
    	}
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  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
    Points : 9 818
    Points
    9 818
    Par défaut
    Merci bien.

    Personnellement, pour redimensionner des images de texte en java, j'utilisais :


    Code java : 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
     
     
    	public static BufferedImage reduceImage(BufferedImage input, int newwidth,
    			int newheight) {
    		BufferedImage out = null;
    		//on choisie le type de couleur suivant le nombre de composants
    		if(input.getColorModel().getNumColorComponents() == 1)
    		 out = new BufferedImage(newwidth, newheight, BufferedImage.TYPE_BYTE_GRAY);
    		else
    			out = new BufferedImage(newwidth, newheight, BufferedImage.TYPE_INT_RGB);
     
    		Graphics2D g = out.createGraphics();
    		System.err.println("Temp color model : " + input.getColorModel());
    		Image scaled = input.getScaledInstance(newwidth, newheight,	Image.SCALE_SMOOTH); //on utilise un SCALE_SMOOTH pour obtenir une petite image correcte
    		g.drawImage(scaled, 0, 0, out.getWidth(), out.getHeight(), null);
    		g.dispose();
    		return out;
    	}
     
    	public static BufferedImage reduceImage(BufferedImage input, float factor) {
    		int newwidth = (int) (((double) input.getWidth()) * factor);
    		int newheight = (int) (((double) input.getHeight()) * factor);
    		return reduceImage(input, newwidth, newheight);
    	}

    Donc notamment le : getScaledInstance(newwidth, newheight, Image.SCALE_SMOOTH);
    Je ne répondrai à aucune question technique en privé

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par millie Voir le message
    Donc notamment le : getScaledInstance(newwidth, newheight, Image.SCALE_SMOOTH);
    Ah oui, le AreaAveragingScaleFilter.

    Citation Envoyé par javadoc de AreaAveragingScaleFilter
    This class extends the basic ImageFilter Class to scale an existing image and provide a source for a new image containing the resampled image. The pixels in the source image are blended to produce pixels for an image of the specified size. The blending process is analogous to scaling up the source image to a multiple of the destination size using pixel replication and then scaling it back down to the destination size by simply averaging all the pixels in the supersized image that fall within a given pixel of the destination image
    C'est vrai que ça donne aussi de très bons résultats. En fait, ca donne la meme qualité que Lanczos avec le support par défaut. Si on augmente la taille du support, le sampling de Lanczos est un petit poil meilleur... mais vraiement un petit poil.

    Mais bon, j'aime bien Lanczos alors je l'utilise souvent.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  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
    Points : 9 818
    Points
    9 818
    Par défaut
    En fait, j'avais eu le problème il y a 2 mois, je devais afficher en miniature des images TIFF qui contenait du texte, et ça faisait tout crade avec les redimensionnements par défaut.


    Méthode classique avec interpolation simple (enfin, n'importe quel interpolation, c'est à peu près pareil)


    Méthode avec le smooth


    J'avais posté une contribution d'ailleurs :
    http://www.developpez.net/forums/d64...bufferedimage/
    Je ne répondrai à aucune question technique en privé

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En ce qui concerne le redimensionnement il peut éventuellement être intéressant de passer par quelque chose ressemblant à du mip mapping, il y a un post de gfx qui traîne dans le forum java à ce sujet, en utilisant une succession de redimensionnements.

    Accessoirement il ne faut pas utiliser getScaledInstance, c'est du complet soft et ça rame pour ce que c'est, cf blog de Chris Campbell

    http://today.java.net/pub/a/today/20...dinstance.html

    Sinon en passant y'a SwingX qui inclut un paquet d'implémentations de Blending modes légués par Romain Guy (gfx encore) dont vous trouverez des exemples sur son blog
    http://www.curious-creature.org/2006...es-for-swingx/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par sinok Voir le message
    Accessoirement il ne faut pas utiliser getScaledInstance, c'est du complet soft et ça rame pour ce que c'est, cf blog de Chris Campbell
    Hum... on doit pas trop avoir la meme definition de "ramer", vue la vitesse de certains de mes filtres.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Hum... on doit pas trop avoir la meme definition de "ramer", vue la vitesse de certains de mes filtres.
    Tout dépend de l'utilisation bien entendu...
    Quand on veut présenter des thumbnails dans une appli on évite de passer par les solutions les plus couteuses, sachant qu'en soft (getScaledInstance) ce sera plus long qu'un drawImage qui sera accéléré matériellement et d'une qualité au moins égale voire même meilleure.


    Mais bon il vrai que je pinaille complètement dans le cas présent
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    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
    Points : 9 818
    Points
    9 818
    Par défaut
    Comme dit sur l'autre, les méthodes classique java de redimensionnement par interpolation linear, bilinear marchent très mal pour du texte.
    Je ne répondrai à aucune question technique en privé

  9. #9
    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
    Points : 9 818
    Points
    9 818
    Par défaut
    J'ai intégré.

    Voici la différence de compression avec :

    Interpolation bicubique classique :


    Méthode lanc :


    Méthode avec le smooth :
    Images attachées Images attachées    
    Je ne répondrai à aucune question technique en privé

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    La différence est fort subtile.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    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
    Points : 9 818
    Points
    9 818
    Par défaut
    Bon, je crois que j'ai trouvé encore un bug dans l'API d'images de Sun (enfin, ça ne serait que le deuxième)

    Je crois que les ConvolveOp de l'API standard se plante lamentablement quand le type est ARGB. Tu peux d'ailleurs constater en utilisant ton opérateur (qui transforme donc en ARGB) puis en appliquant une convolution (ou n'importe quoi qui utilise une convolution de la lib standard comme Emboss)...


    Dans la futur release, j'ai aussi mis en place un système de cache un peu plus malin pour les undo/redo et les setCacheable() (genre, je swape les données les plus anciennes sur le disque dur quand il y a trop d'images). Ca permet d'éviter pas mal d'OutOfMemoryException
    Je ne répondrai à aucune question technique en privé

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par millie Voir le message
    Tu peux d'ailleurs constater en utilisant ton opérateur (qui transforme donc en ARGB) puis en appliquant une convolution (ou n'importe quoi qui utilise une convolution de la lib standard comme Emboss)...
    Remarque, je renvoie un ARGB dont la chanel Alpha est forcé a 0xFF. Autant dire que j'aurai du renvoyer un simple RGB.

    Ca vaut d'ailleurs pour tous les autres filtres que j'ai fait. arg !
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    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
    Points : 9 818
    Points
    9 818
    Par défaut
    Marrant, si tu tapes : "ConvolveOp ARGB bug" sur google, tu tombes déjà ici

    Mais je n'ai pas trouvé de bug truc sur le site de sun par rapport à ça (contrairement à l'autre bug que j'avais vu avec les LookupOp)
    Je ne répondrai à aucune question technique en privé

  14. #14
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par millie Voir le message
    Marrant, si tu tapes : "ConvolveOp ARGB bug" sur google, tu tombes déjà ici
    Ouais !!! On est des stars de l'ARGB Bug.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  15. #15
    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
    Points : 9 818
    Points
    9 818
    Par défaut
    releasée
    Je ne répondrai à aucune question technique en privé

  16. #16
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par millie Voir le message
    releasée
    mince, j'étais en train de modifier HarrisFast suite à une discussion du forum... trop tard.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  17. #17
    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
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    mince, j'étais en train de modifier HarrisFast suite à une discussion du forum... trop tard.
    Ouais, spa grave.

    Il y a eu une grosse modif sur un système de cache car la mémoire avait tendance à exploser quand les filtres étaient en setCacheable ou à cause des undo/redo (qui marchait surtout qu'en undo ^^). Donc ça sera toujours ça de releasé.
    + la modif avec le MillieCommand avec la commande -help
    Je ne répondrai à aucune question technique en privé

  18. #18
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    overflow dans mon code lorsque le noyau est très grand : les résultats intermédiaires de la convolution ne tient pas dans un "integer". Il faut passer les buffers en double.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // temporary buffer used for convolution
    private double[] tmpbuffer_r = new double[0];
    private double[] tmpbuffer_g = new double[0];
    private double[] tmpbuffer_b = new double[0];
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Suggestion] Ajout Plugin WaterShed
    Par pseudocode dans le forum Millie
    Réponses: 11
    Dernier message: 15/08/2021, 09h52
  2. ajout plugin PHPExcel sous Symfony eclipse
    Par megaloplex dans le forum Plugins
    Réponses: 1
    Dernier message: 06/05/2010, 13h32
  3. [Suggestion] Ajout plugin LocalContrast
    Par pseudocode dans le forum Millie
    Réponses: 10
    Dernier message: 22/01/2010, 18h32
  4. [Suggestion] Ajout de traitement en masse
    Par millie dans le forum Millie
    Réponses: 13
    Dernier message: 28/01/2009, 17h36
  5. [Suggestion] Ajout Plugin Hough
    Par pseudocode dans le forum Millie
    Réponses: 3
    Dernier message: 12/12/2008, 19h10

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