Bonjour,
Lorsque on clique sur "Enregister" dans SavePictureDialog1 ça passe le paramètre "Execute" ci-après à true :Basile : j'ai remarqué que l'on pouvait enregistrer son travail mais je n'ai pas compris comment!
et alors l'instruction imgResized.Picture.Bitmap.SaveToFile(FileName) enregistre le BitMap contenu dans le TImage "imgResized" sur le disque sous le nom de FileName.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if Execute then begin imgResized.Picture.Bitmap.SaveToFile(FileName); end;
Les lignes qui sont au début de la procedure TFrmDemoMain.btnSaveBitmapClick() :
ne sont rien d'autre qu'un tripatouillage pour fixer la valeur de FileName :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 const nf = 'XBR_Redimensionné.bmp'; var nfc: string; begin with SavePictureDialog1 do begin Filter := 'Fichier *.bmp|*.bmp)'; if FN = '' then FileName := nf else begin nfc := extractFileName(FN); nfc := ChangeFileExt(nfc, '.bmp'); FileName := 'Redimensionné_' + nfc; end;
"FN" est le nom du fichier-source chargé, mais c'est une chaîne vide lorsqu'on n'a rien chargé et qu'on veut enregistrer l'agrandissement de l'image-source embarquée par conception et dans ce cas FileName prend la valeur de la constante nf = 'XBR_Redimensionné.bmp'
.... mais si on a chargé un fichier-image on récupère son nom, on change son extension en BMP et on lui colle le préfixe 'Redimensionné_' avant l'enregistrement.
La routine d'agrandissement XBR est lancée avec l'instruction aBmp := StretchXBR(imgOriginal.Picture.Bitmap, ScaleValue, ProgressBar1.StepIt);et aussi, comment avez-vous réussi à faire progresser la ProgressBar ?
La fonction qui exécute est déclarée ainsi : function StretchXBR(const BmpS: tBitMap; ScaleFactor: Single; const ProgressCallBack: TObjectProc = nil): tBitMap;
Et dans la boucle principale de cette fonction un if Assigned(ProgressCallBack) then ProgressCallBack; actionne la méthode StepIt de la ProgressBar1 en avançant sa position de la valeur spécifiée par la propriété Step.
A chaque appel elle change la forme du Screen cursor :Et je n'ai pas trop compris la procédure sablier.
- s'il vaut crDefault on le bascule à crHourGlass
- s'il vaut crHourGlass on le bascule à crDefault
Dans les temps anciens crHourGlass provoquait l'apparition d'un curseur en forme de Sablier mais actuellement ce sablier est remplacé par une petite couronne telle qu'une ProgressBar circulaire.
Pour des process qui ne durent pas trop longtemps ça remplace une ProgressBar et simplifie le code (on déclenche la procedure Sablier au début et à la fin du process en question) ... et si le process est instantané on n'a pas le temps de voir le changement.
A+.
EDIT du 30/05/2013 : Oups, ta question au sujet du fonctionnement de la progressBar m'a donné l'occase de repérer une imperfection : j'avais omis d'ajuster la progression à la taille du BitMap agrandi, mais il suffit d'ajouter les deux lignes en vert ci-dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TFrmDemoMain.bStretchXBRClick(Sender: TObject); begin edMis.text := ''; edMis.Update; //Sablier; ProgressBar1.Max:=trunc(imgOriginal.Picture.Bitmap.Height*ScaleValue); ProgressBar1.Step:=10; GTC := GetTickCount; aBmp := StretchXBR(imgOriginal.Picture.Bitmap, ScaleValue, ProgressBar1.StepIt); ... // suite inchangée ... ... end;
Partager