[Tout langage] Redimensionner une image - algorithme pour dimensionnement

:hello: a tous et à toutes

Je suis à la recherche d’un algorithme qui me permettrait de redimensionner une image suivant les criteres suivants :
-nouvelle largeur
-nouvelle hauteur.

Cet algo serait implenté dans un programme tournant sur un téléphone mobile. Il faudrait donc qu’il soit simple et rapide.

Je suis preneur de toute idée et de tous liens utiles

Merci d’avance :jap:

Bonjour, :hello:
Sur un téléphone modile tu dit ??
tu es sûr? car tu rsique de ne pas avoir beaucoup de choix

En Java Jme c’est possible, mais limité, essaye de voir ici:
http://java.sun.com/javame/reference/docs/index.html

pour voir si tu arrive à récupérer l’image sous forme de bitmap.
Après, l’algo sur la bitmap dépend de la qualité que tu veux, tu peux alors calculer pixel par pixel, c’est assez simple, mais surement pas hyper efficace en perf. :neutre:

Edit: dans la spécification MIDP on trouve des classes intéressantes pur les images:
javax.microedition.lcdui.Image
qui utilise un Image dans un tableau d’int au format 0xAARRGGBB

merci mais j’avais deja remarqué

mon probleme est que je ne sais pas quel traitement appliquer aux pixelx pour obtenir une image plus petite. Je n’ai pas trouvé de méthode equivalente à Image.getScaledInstance(…)

Ce que je recherche avant tout c’est un algorithme a implementer en java.

Un algo pour réduire une image?
Bon, je vois plusieurs solution: tu peux regarder les sources du jse, voir comment ils implémentent Image.getScaledInstance(). et voir comment l’adpater aux classes du JME( javax.microedition.lcdui.Image)
-> code ton propre algo from scratch, nétant pas spécialiste en traitement d’image ma méthode est la suivante:

-allouer le tableau d’int de la nouvelle image

  • boucler sur tous les pixels de la nouvelle image pour calculer leur valeur
  • sur chaque pixel à calculer, rechercher la position dans l’image d’origine
  • prendre la valeur AARRGGBB dans l’ancienne image.

C’est sur le dernier point qu’il y a moyen d’avoir une meilleure qualité, si tu prend juste la valeur d’un pixel sur l’image d’origine, le résultat sera un peu faux, et si tu prend la valeur de plusieurs pixel, il faudrait moyenner chaque pixel de l’image d’origine.
Si tu divise par deux la largeur et la hauteur, l’algo est beaucoup plus simple à coder.

La version basique avec un seul point dans l’image d’origine (non-garanti):


/**
 * Class Zoom
 * @author deltree
 */
public class Zoom {
	
	
	public void unzoom(int[][] in, int[][] out){
  for(int i=0;i<out.length;i++)
  	for(int j=0;j<out[i].length;j++)
    out[i][j]= computepixel(in,i,j,out.length,out[i].length);
	}
	
	
	private int computepixel(int[][] out, float i, float j, int width, int height) {
   float x,y;
   x=(float) (i/width)*out.length;
  y=(float) (j/height)*out[0].length;
  x=(x<out.length)?x:(out.length-1);
  y=(y<out[0].length)?y:(out[0].length-1);
  return out[(int)x][(int)y];
	}

	public static void main(String[] argv){
  int[][] oldimage = new int[][]{
  	{0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF},
  	{0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF},
  	{0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF},
  	{0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}
  };
  int[][] newimage = new int[2][2];
  new Zoom().unzoom(oldimage,newimage);
	}

:slight_smile: