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 !

EASYCOMPRESSJPG - COMPRESSE LES IMAGES JPEG


Information sur la source

Catégorie :Graphique Classé sous : jpeg, jpg, compression, image Niveau : Débutant Date de création : 03/01/2005 Date de mise à jour : 20/08/2008 01:26:07 Vu / téléchargé: 6 439 / 663

Note :
9,6 / 10 - par 5 personnes
9,60 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Ce programme permet de "compresser" les images jpeg en réduisant leur qualité pour obtenir une image moins lourde, mais de qualité moins bonne aussi. Pour afficher l'aperçu des images et leurs tailles (avant/après compression), il suffit d'ouvrir les "Détails >>>"

ATTENTION : MISE A JOUR MAJEURE : NOUVELLE SOURCE
http://www.delphifr.com/codes/EASYCOMPRESSJPG-V4-COMPRESSION-AVANCEE-IMAGES-JPEG_47663.aspx

J'ai laissé cette ancienne version sur ce site car j'ai réécrit l'application en partant de la toute base (un projet delphi vide en fait), 2 ans plus tard (voir 3 quand j'y repense :p )
Autrement dit, il n'y a rien en commun au niveau du code par rapport à celle-ci, et s'il persiste quelques similarités au niveau du fonctionnement global, toutes les caractéristiques ont été grandement améliorées dans la nouvelle version. De plus, comme il y avait quelques commentaires de membres ici, j'ai préféré ne pas couper toutes les références déjà existantes et ainsi laisser l'accès à cette ancienne version.

Donc, si vous êtes intéressés par cette source, allez plutôt là :
http://www.delphifr.com/codes/EASYCOMPRESSJPG-V4-COMPRESSION-AVANCEE-IMAGES-JPEG_47663.aspx
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

19 janvier 2005 21:02:44 :
Désolé pour l'attente, mais j'ai été très occupé ces derniers jours et je n'avais pas des heures entières à me consacrer à delphi... :) Pour cette nouvelle version, j'ai essayé de tenir compte des remarques de chacun :) - Commentaires en bout de ligne ; - Structures initialization & finalization ; - Simplification des tests ; - Recherche de doublons lors de l'ajout d'images (en effet, quand deux images avaient le même nom dans la liste, cela créait un conflit lors de l'enregistrement en compressé, vu qu'elles se retrouvaient dans le même dossier avec le même nom...) Merci aussi pour les conseils de Caribensila : - Aperçu de l'image avant & après compression ; - Affichage de la taille du fichier d'origine et du fichier obtenu ;
19 février 2005 11:14:20 :
Quelques modifs (Merci à GrandVizir de ses propositions) : - La fiche d'aperçu se ferme quand on clique dessus. Elle occupe maintenant le plein écran. - Ajout des commandes "Tout Ajouter" et "Tout Supprimer" - Choix entre compresser et copier les images dans un dossier OU remplacer les fichiers - Drag&Drop ajouté : on peut "Drag&Droper" un dossier (ajout de toutes les images contenues dedans) ou une image dans la liste des images sélectionnées.
20 août 2008 01:26:07 :
MISE A JOUR MAJEURE : NOUVELLE SOURCE http://www.delphifr.com/codes/EASYCOMPRESSJPG-V4-COMPRESSION-AVANCEE-IMAGES-JPEG_47663.aspx

Commentaires et avis

signaler à un administrateur
Commentaire de jmp77 le 04/01/2005 13:12:23

Hello,

J'ai voulu tester et voici l erreur que j'ai eu à la compilation :
[Erreur fatale] Compress.dpr(7): Fichier non trouvé : 'ToolEdit.dcu'

++,
JMP77.

signaler à un administrateur
Commentaire de ni69 le 04/01/2005 17:32:18

Désolé, c'est un résidu d'une ancienne version... Tu peux le supprimer de uses...

Bonne Prog'
@+
Nico

signaler à un administrateur
Commentaire de grandvizir le 05/01/2005 16:19:27

jmp77> :))))))

ni69> Je serais enfin le premier à te dire qu'il existe des fichiers inutiles dans le Zip. Va voir à gauche dans... vous connaissez la suite. Sinon j'ai 4 remarques:

LA PREMIERE:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); doit devenir un évènement OnCloseQuery. OnClose est appelé via Form.Close. Or, si le user clique sur la croix, OnClose n'est pas appelé, contrairement à OnCloseQuery également appelée par Form.Close.

LA SECONDE:
Je suis noyé dans les commentaires... Met les tjs en bout de ligne. Sinon je sors fatalement mon code source 24746.

LA TROISIEME:
Pour remédier au pb des OnClose*, gère plutôt une structure du type suivant:

var MaJPg : TJpegImage;
implementation
[...]
initialization
MaJPG:=TJpegImage.Create;
finalization
MaJPG.Free;
end.

Et bien sûr, il faut Free dans l'ordre inverse des ordres de création. Exemple:

initialization
Jpg1.Create;
Jpg2.Create;
finalization
Jpg2.Free;
Jpg1.Free;
end.

Si tu veux gérer uniquement des finalization, il faut impérativement avoir ceci. Ca va par couple.

initialization
finalization
MaJpg.Free;
end.

LA QUATRIEME:
Dans le cas unique qui est celui-ci, il est cohérent de remplacer
procedure TForm1.ImagesDuDossierClick(Sender: TObject);
begin
if (ImagesDuDossier.ItemIndex <> -1) then
  AjouteImage.Enabled := True;
end;
Par: AjouteImage.Enabled:= (ImagesDuDossier.ItemIndex<>-1);

Notepad explique tout...

signaler à un administrateur
Commentaire de JulioDelphi le 05/01/2005 16:43:46 administrateur CS

GrandVizir : N'importe quoi ...
je reprends tes remarques :
------------------------------------------
1ere : OnClose est appelé lors du clic sur la croix de la form.
J'ai testé comme suis :
OnCloseQuery : ShowMessage('CloseQuery');
OnClose : ShowMessage('Close');
et en cliquant sur la croix, j'ai les messages "CloseQuery" pui apres le clic sur OK "Close"
Si ni69 mets ses free en closeQuery, et qu'il decide par la suite de mettre une demande de confirmation de fermeture du programme dedans ça donnera :

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := MessageDlg('Quitter ?',mtConfirmation,[mbYes,mbNo],0)=mrYes;
// ici mes free;
end;

mes ~.Free seront executés ALORS que j'en ai encore besoin CAR je ne quitte pas le programme ! (si je clic sur "non" bien sur)
----------------------------------------
2eme) pour une fois qu'il y a des commentaires, on ne va pas lui demander en plus de les formater :D ahah
-----------------------------------------
3eme) chui d'accord avec toi pour le initialization et finalization, tu peux expliquer pourquoi l'ordre des free est important ?
----------------------------------------
4eme) 1000% d'accord !

voila c tout :) rien de méchant mais j'ai été choqué par la 1ere lol

ni69 : je viens de le regarder et euh bah bien ! :) tu as meme vérifié que l'image ne sois pas ajoutée deux fois.
Un effort et une originilatié ça serait pas mal pour le design et/ou pour la navigation dans les dossiers :) mais bon l'idee reste bonne !

signaler à un administrateur
Commentaire de grandvizir le 05/01/2005 17:49:36

Merci de ne pas dire "n'importe quoi" lorsque cela n'est pas requis. Ou du moins, il faut nuancer... ;)

J'aurais plutôt mis "...mbNo],0)=idYes;" bien que idYes=mrYes dans Windows.pas. Ca ne change donc rien. Mélangeons donc les bananes et les citrons...

T'as raison pour les ShowMessage, mais sache que je n'ai demandé aucune confirmation. Dans l'exemple inconcevable que tu donnes, il est ridule de Freer car en définitive, tu n'es pas sûr si la fenêtre sera oui ou non fermée.

En réalité, mes objets sont Freés via FINALIZATION. Je n'ai donc pas de pb avec OnClose. En revanche, ta remarque est très pertinente.

En résumé:
OnCloseQuery autorise ou non l'exécution de OnClose
OnClose gère toutes les libérations de mémoire, si cela veut bien se faire correctement. Gare à d'éventuelles exceptions... qui ne fermeraient pas la fenêtre.

signaler à un administrateur
Commentaire de grandvizir le 05/01/2005 18:20:26

Que de peur ! Le post était supprimé un moment (25 minutes)... j'ai pas tout pigé ! A part que les Script Error abondaient.

On va donc pouvoir reprendre...

signaler à un administrateur
Commentaire de grandvizir le 05/01/2005 18:24:08

Je viens de voir que je n'ai pas répondu à une question. Pourquoi l'ordre est-il inversé ?

Une fois que tu as monté un meuble, pour le démonter tu n'enlèves pas la carosserie avant d'enlever les tiroirs... J'espère que cette image est explicite. La lévitation n'existe que dans l'Airbus Zéro-G.

:))

signaler à un administrateur
Commentaire de JulioDelphi le 05/01/2005 18:31:05 administrateur CS

Ouè mais ici c pas un meuble :D, je veux dire "pourquoi faut il le faire ? parce que ..." voila au cas ou c t vraiment important.

il est vrai que pour son appli, il n'y a pas de confirmation, mais dans une prochaine MAJ  on c jamais :p

Les Onclose et OnCloseQuery mélangées avec des libération de mémoire PLUS des confirmation de fermeture, il est vrai que ça peut poser des soucis mémorables (a moi en tout cas lol)

dsl du "n'importe quoi" c pas mechant comme d'hab :) mais mes yeux ont piqués !! lol
de toute façon on est d'accord : ni69 est un chef ! :D

signaler à un administrateur
Commentaire de Caribensila le 05/01/2005 20:04:11

Pour la 4ème remarque de grandvizir, j'aurais une question :
C'est vrai que la proposition de grandvizir est plus propre. Mais est-ce que ça change vraiment qq chose, une fois le code compilé?
Je précise ma question: Ne vaut-il pas mieux favoriser la lisibilité du code plutôt que sa compacité?
... ... ...
Pour les commentaires, c'est un peu pareil, je trouve. Un débutant comme moi se noie plus par la pénurie de commentaires que dans l'excès.  ;)
Et quand on sait l'effort à fournir pour bien commenter un code que l'on connait par coeur, je dis bravo à ni69!
... ... ...
J'ai pas compris l'importance de l'ordre pour libérer les objets... Si on pouvait m'expliquer pour que je ne meurs pas tout à fait con...   lol

signaler à un administrateur
Commentaire de grandvizir le 05/01/2005 20:17:17

Pour être clair, c'est le problème des emboîtements et des chevauchements... Par exemple, on ne peut pas chevaucher les BEGIN...END.

Ceci est incorrect:
begin //ID 1
  begin //ID 2
end; //ID 1
  end; //ID 2

Ceci est en revanche correct:
begin //ID 1
  begin //ID 2
  end; //ID 2
end; //ID 1

Par principe, on fait de même avec CREATE et FREE, et idem avec TRY...EXCEPT...FINALLY.

L'avantage principal est que ça évite des erreurs et des conflicts (mot qui ne prend bien sûr pas de "c", :).

Sinon: bravo à toi JD pour ton nouveau statut, et te souhaite une bonne nouvelle continuation... ;)

signaler à un administrateur
Commentaire de grandvizir le 05/01/2005 20:21:16

Caribensila> Ca ne change rien. Seulement ça exploite les performances des booléens permettant ensuite de réduire les lignes de code. Par exemple:
if Checked then Checked:=false
else Checked=true;
Ceci peut se réduire à: Checked:=not Checked;

Attention: cela dépend des cas. On ne peut pas tjs faire la technique proposée. En fait, il faut analyser les cas... C'est pas évident à expliquer.

signaler à un administrateur
Commentaire de JulioDelphi le 05/01/2005 20:21:56 administrateur CS

Merci a toi :) n'hesite pas a me MP pour une question admin, je suis a ton service.

je reprends :
Ceci est incorrect:
begin //ID 1
  begin //ID 2
end; //ID 1
  end; //ID 2

Ceci est en revanche correct:
begin //ID 1
  begin //ID 2
  end; //ID 2
end; //ID 1

mais une fois le code compilé : ça marche quand meme
a la lisibilité : c moche et mal ordonné

c un peu comme <b><i>Gras et italique</b></i> qui fonctionne mais pas correct, me trompe-je ?

cari : oui une fois le code compilé c idem, mais il se peut que on gagne 1/10 de nanoseconde :D

signaler à un administrateur
Commentaire de ni69 le 05/01/2005 20:35:01

GrandVizir :
- Merci pour la quatrième remarque : j'ai modifié ça :)
- Pour les commentaires, j'estime que je n'en mets pas de trop, étant donné le nombre de commentaires du forum traitant du manque de commentaires de certaines sources... je laisse donc tel quel.
- Pour Initialization / Finalization, je vais remplacer ça tout de suite : en effet j'y pense d'habitude, mais cette fois ci, j'avais oublié ;) Merci de me le rappeler !

JulioDelphi :
"Un effort et une originilatié ça serait pas mal pour le design et/ou pour la navigation dans les dossiers :) " >> Qu'entends-tu par navigation dans les dossiers ? Qu'est-ce qui ne vas pas ? Serais-ce le choix du répertoire de destination ? Pour le design, je vais réfléchir... En tout cas, merci pour tes messages :)

Caribensila : merci pour tes idées données dans ton MP. Je vais voir ce que je peux faire ;)


Je ne vais pas tarder à faire une MAJ... Merci de vos idées respectives ;)

Bonne Prog'
@+
Nico

signaler à un administrateur
Commentaire de grandvizir le 05/01/2005 20:37:02

T'as pris une horloge atomique pour mesurer ? :)))

Ton exemple HTML est tout à fait correct. Je n'y avais pas pensé.

signaler à un administrateur
Commentaire de JulioDelphi le 05/01/2005 20:42:28 administrateur CS

Non ce code HTML est signalé MAUVAIS par le W3C HTML 4.0 ... :(
mdr nan de tete voyons !!

signaler à un administrateur
Commentaire de grandvizir le 05/01/2005 20:47:56

Bien sûr qu'il est mauvais... il est bon dans le sens où il n'est pas bon. Euh ? Il est correct pour l'illustration de la chose à ne pas faire.

signaler à un administrateur
Commentaire de grandvizir le 06/01/2005 17:04:46

J'ai trouvé un code pour illustrer Caribensila.

Vous vous rappelez qu'il fallait remplacer par:
AjouteImage.Enabled:= (ImagesDuDossier.ItemIndex<>-1);

Eh bien dans le code suivant, il ne faut pas le faire. La casse est respectée dans la liste. Pour ignorer la casse, utiliser LowerCase ou UpperCase.

function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
    b : boolean;
begin
  b:=false;
  for x:=0 to STL.Count-1 do
    if STL[x]=S then
      b:=true;
  Recherche:=b;
end;

Je suis passé volontairement par une variable B pour bien comprendre. Le principe est de dire si la chaîne S est contenue dans la liste STL (le VAR peut être omis selon DelphiProg, mais... pas d'embrouille please bien que ce soit un objet). Bref...

Dans le code de ni69, on a une situation en TOR (Tout Ou Rien). Le processus est indépendant de tout résultat antérieur. Or, dans ma boucle (qu'on aurait pu breaker), on défile tous les items de la liste et le résultat n'est rendu qu'une fois tous scannés. Le TOR n'existe plus. On est placé dans une continuité...

Ainsi, le code suivant est incorrect:

function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
    b : boolean;
begin
  b:=false;
  for x:=0 to STL.Count-1 do
    b:= STL[x]=S;
  Recherche:=b;
end;

En effet... si la liste contient 2 items (on rappelle que l'index de liste commence à 0), et que S=STL[0], alors dans le code alors proposé, à la fin, le résultat est équivalent à b:= S=STL[1]; Ce qui est complètement faux, car en réalité, on devrait avoir: b:=S=STL[0];

En revanche, le code suivant est correct, mais plus lourd à la lecture.

function Recherche(var STL:TStringList; S:string):boolean;
var x : cardinal;
    b : boolean;
begin
  b:=false;
  for x:=0 to STL.Count-1 do
    begin
      b:= STL[x]=S;
      if b then Break;
    end;
  Recherche:=b;
end;

Pour en revenir à JulioDelphi... Le code suivant est bien sûr juste. Mais son exécution ne correspond pas à ce que tu attends:

begin //ID 1
  begin //ID 2
end; //ID 1
  end; //ID 2

Ce n'est pas un problème d'alignement. Ce dernier est justement là pour montrer qu'on voulait chevaucher les BEGIN...END. Pour être clair:

oooo> DELPHI interprète ainsi:
begin //ID 1
  begin //ID 2
  end; //ID 1
end; //ID 2

oooo> MAIS on voulait ce qui suit (et ce n'est pas pareil)
begin //ID 1
  begin //ID 2
end; //ID 1
  end; //ID 2

!!!!! C'EST POUR CELA QUE JE DIS QUE L'ALIGNEMENT DES CODES SOURCES PERMET D'EVITER DES ERREURS A LA *** !!!!!

J'espère que cela est rentré dans les têtes. Là, il n'y a pas beaucoup de lignes, mais parfois, j'ai des alignements qui font la largeur de l'écran. Donc... ça sert !

Sinon, ma proposition N°1 était effectivement fausse. Je ne sait pas ce que j'avais à ce moment... ??

Désolé que certains messages soient temporellement proches, mais des posts ont été postés simultanément si bien que j'ai bien été obligé de répondre immédiatement;)

signaler à un administrateur
Commentaire de Caribensila le 06/01/2005 18:23:46

Ok! C'est très clair, grandvisir.
Merci beaucoup pour l'effort pédagogique!  

(   'serai toujours étonné par le devouement de bcp, ici.
Ca fait plaisir à voir...   :)

signaler à un administrateur
Commentaire de ni69 le 13/01/2005 12:06:41

Merci pour cette belle illustration GrandVizir ! ;)

signaler à un administrateur
Commentaire de grandvizir le 19/01/2005 18:18:33

C'est pas le tout, mais maintenant il faut le mettre à jour parce que j'ai vraiment envie de le compiler enfin une fois...

signaler à un administrateur
Commentaire de ni69 le 19/01/2005 21:08:11

Voilà c'est fait ;)

signaler à un administrateur
Commentaire de grandvizir le 17/02/2005 19:34:06

J'ai enfin pris le Zip, et j'aurais quelques gadgets à faire ajouter:

1) Rendre dynamique TrackBar_CompressionChange(...);
2) Form4.ImageOnClick := FermerLaFenêtre ;
3) Gérer un ImagesDuDossier.MultiSelect, car j'ai 2746 Jpg à coincer
4) Faire éventuellement une fonction de remplacement de fichier: on le charge en mémoire, on comprime le stream, on suppr le fichier, et on enregistre.
5) J'ai pas de chance sur le coup: je suis en 800 par 600.
6) Un petit drag-drop de entre 2 listes box serait sympa (cf. les démos de Delphi)
7) Tiens ? Form4 ? C'est un nom pas nommé ça...

Au final, c'est un prog sympa. Un mauvais coup n'empêche pas un bien...

signaler à un administrateur
Commentaire de ni69 le 18/02/2005 20:52:31

Merci pour tes remarques :)

Pour la propostition 1, c'est ce que j'avais pensé faire au départ, mais à chaque fois que l'on

bougeait sur la trackbar d'une unité, ça mettait des plombes à recharger les grandes images,

donc j'ai préféré utiliser le principe du "Rafraichir"...
2 : OK pas de prob
3 : c'est ce que j'envisageais de faire
4 : c'est vrai ça serait pratique je vais y penser ;)
5 : dsl, mais je n'ai pas trouvé de meilleure organisation pour ma fenêtre... :(
6 : je vais arranger ça...
7 : le nom de la Form4 n'a pas trop d'intérêt, mais bon....

@+
Nico

signaler à un administrateur
Commentaire de ni69 le 19/02/2005 11:15:14

Source mise à jour (voir les détails dans la partie "Historique de cette source")

signaler à un administrateur
Commentaire de ni69 le 20/08/2008 01:24:17

MISE A JOUR MAJEURE : NOUVELLE SOURCE
http://www.delphifr.com/codes/EASYCOMPRESSJPG-V4-COMPRESSION-AVANCEE-IMAGES-JPEG_47663.aspx

J'ai laissé cette ancienne version sur ce site car j'ai réécrit l'application en partant de la toute base (un projet delphi vide en fait), 2 ans plus tard (voir 3 quand j'y repense :p )
Autrement dit, il n'y a rien en commun au niveau du code par rapport à celle-ci, et s'il persiste quelques similarités au niveau du fonctionnement global, toutes les caractéristiques ont été grandement améliorées dans la nouvelle version. De plus, comme il y avait quelques commentaires de membres ici, j'ai préféré ne pas couper toutes les références déjà existantes et ainsi laisser l'accès à cette ancienne version.

Donc, si vous êtes intéressés par cette source, allez plutôt là :
http://www.delphifr.com/codes/EASYCOMPRESSJPG-V4-COMPRESSION-AVANCEE-IMAGES-JPEG_47663.aspx

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

du jpeg ou jpg dans une image Tdbimage [ par yvessimon ] TDBimage &nbsp;accepte le format bmp.Avec&nbsp; les formats&nbsp; &nbsp;jpeg&nbsp;&nbsp; ou&nbsp;&nbsp; jpg&nbsp;&nbsp; il y a une erreur !Question :E Chargement d'image dans un TImage [ par John Dogget ] Bonjour à tous.Je souhaite afficher une image dans un TImage par programmation, et non via IDE.Voila ce que j'ecris :Image1.Picture.LoadFromFile(&lt;c Format Png [ par cincap ] Bonjour à toutes et à tous,J'aimerai pouvoir charger une image en Png, mon code permet de charger un Jpg et Bmp mais par contre pour un Png, l'image r Comment récuperer la taille d'une image JPEG [ par cirec ] Salut à tous,Je fais appel à vos lumières parce que là je coince grave.Je cherche le moyen de récuperer la taille (en pixels) d'une Image JPEG et PNG Problème impression couleur [ par kacola ] Bonjour, j'ai une imprimante couleur Canon MP780 et une Laser N&amp;B Canon (qui est par défaut),Je souhaite imprimer une image (un jpeg) en couleur, comment inserer une image JPEG dans une bdd sql [ par fbsoft ] bonjour, j'aimerai bien savoir comment inserer une image de type "jpg" dand une bdd sql server 2000 merci Comment afficher-imprimer une image(jpg) avec RAVE ? [ par Nyou ] Bonjour,Je developpe une appli de base de données avec un champs texte qui prend le chemin complet du fichier image. Dans Delphi, je l'ouvre avec open Taille d'une Image jpeg pour fichier binaire. [ par Caribensila ] Salut à tous.Vous allez bien?Moi, je rame sur un petit truc depuis pas mal de temps...Voilà, j'ai besoin de connaître la taille en octets d'une image sélection dans une image Jpeg [ par dieuchrist ] Bijour,voilà mon tit problème:je dois faire un recadreur d'image(pouvoir sélectionner une partie de l'image) jpeg, tout en choisisant un rapport de fo BMP -> JPG - Image jpeg toute verte [ par Filipe35 ] Bonjour &#224; tous,je souhaiterais convertir des bmp en jpgj'ai test&#233; les 2 codes suivantsimg := Timage.Create(self);img.Picture.LoadFromFile(''


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Appels d'offres

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,265 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS