EASYCOMPRESSJPG - COMPRESSE LES IMAGES JPEG

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 - 4 janv. 2005 à 13:12
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 - 19 févr. 2005 à 11:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/28592-easycompressjpg-compresse-les-images-jpeg

ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
19 févr. 2005 à 11:15
Source mise à jour (voir les détails dans la partie "Historique de cette source")
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
18 févr. 2005 à 20:52
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
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
17 févr. 2005 à 19:34
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...
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
19 janv. 2005 à 21:08
Voilà c'est fait ;)
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
19 janv. 2005 à 18:18
C'est pas le tout, mais maintenant il faut le mettre à jour parce que j'ai vraiment envie de le compiler enfin une fois...
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
13 janv. 2005 à 12:06
Merci pour cette belle illustration GrandVizir ! ;)
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
6 janv. 2005 à 18:23
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... :)
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
6 janv. 2005 à 17:04
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;)
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
5 janv. 2005 à 20:47
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.
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
5 janv. 2005 à 20:42
Non ce code HTML est signalé MAUVAIS par le W3C HTML 4.0 ... :(
mdr nan de tete voyons !!
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
5 janv. 2005 à 20:37
T'as pris une horloge atomique pour mesurer ? :)))

Ton exemple HTML est tout à fait correct. Je n'y avais pas pensé.
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
5 janv. 2005 à 20:35
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
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
5 janv. 2005 à 20:21
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 Gras et italique 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
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
5 janv. 2005 à 20:21
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.
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
5 janv. 2005 à 20: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... ;)
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
5 janv. 2005 à 20:04
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
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
5 janv. 2005 à 18:31
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
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
5 janv. 2005 à 18:24
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.

:))
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
5 janv. 2005 à 18:20
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...
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
5 janv. 2005 à 17:49
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.
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
5 janv. 2005 à 16:43
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 !
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
5 janv. 2005 à 16:19
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...
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
4 janv. 2005 à 17:32
Désolé, c'est un résidu d'une ancienne version... Tu peux le supprimer de uses...

Bonne Prog'
@+
Nico
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
4 janv. 2005 à 13:12
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.
Rejoignez-nous