Bonjour,
J'espère que Gilles passe par là, ce post lui est dédié...
La nuit portant conseil et me souvenant que les compos Mitchell s'en sortent pas trop mal, ce matin je génère un projet à base de ces compos + TImage/TBitmap.
Et tant qu'à y être je génère aussi deux fichiers "exotiques" en rognant 1 ligne et 1 colonne de celui qu'on voit depuis un moment, soit 127x63 en 24 et 32 bits, et roule ma poule.
Tout fonctionnerait bien (vous notez le conditionnel) s'il n'y avait pas une blague avec StretchBlt qui fait sauter le byte Alpha dans la destination quand la source est en pf32bits, ce n'est pas trop grave, je vais bricoler une moulinette qui le rajoute.
Par contre, voilà le truc dément pour Gilles, quelque part entre le calcul du scaling et le Stretch proprement dit (j'ai gardé les commentaires de Jérôme en majuscule pour se repérer) :
Oui oui, vous avez bien lu, même si la source est en pf 24 et donc aucun changement pour la destination, la présence de LA LIGNE fait que l'image est noire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // Etape 1 --> CREATION D'UN TBITMAP DE DESTINATION // jpt : sert à rien avec TImage/TBitmap, adaptation des dimensions, plutôt with imgDst do begin Width := dstRect.Right; Height := dstRect.Bottom; // si ligne pf dessous présente, alors image affichée noire, // indépendamment du pf de la source, 24 comme 32 ! // en jouant avec page préc/page suiv ça la fait apparaître. Picture.Bitmap.PixelFormat := imgSrc.Picture.Bitmap.PixelFormat; // LA LIGNE ! Picture.Bitmap.Width := Width; Picture.Bitmap.Height := Height; end; // Etape 2--> MODIFICATION DES DONNEES ORIGINELLES VERS LE TBITMAP DE DESTINATION
J'ai essayé 10 fois, histoire d'être sûr que je ne suis pas fou et, non, c'est bien le compilo qui se prend les pieds dans le tapis et génère un code mal fichu.
Bon, ok, c'est une vieille version, alors, quelqu'un pour tester avec une 3.0 ?
Vous avez juste besoin de 2 TImage, imgSrc et imgDst, direct depuis la palette des compos, je ne leur ai changé aucune propriété (à part le nom).
Changement du LoadFile :
Petite modif à la fin de la MitchellTask :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function TForm1.LoadFile(f: string): boolean; begin Result := False; try imgSrc.Picture.Bitmap.Assign(MitchellTask(f)); Result := True; finally end; end;
La proc pour le trackbar
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ... end; ci.Free; with imgSrc do begin Width := srcRect.Right; Height := srcRect.Bottom; end; end;
Et le FormCreate
Code : 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 procedure TForm1.trkScaleChange(Sender: TObject); var scale: single; begin scale := trkScale.Position / 100; lblStep.Caption := 'Step : ' + FloatToStr( round (scale*10) / 10 ); // donne des valeurs bien arrondies genre 0.3 1.2 etc. // et en admettant qu'elles soient utiles, comment les récupérer ? with dstRect do begin // calcul des dimensions de la cible Left := 0; Top := 0; Right := round(srcRect.Right * scale); Bottom := round(srcRect.Bottom * scale); end; Caption := its(dstRect.Right)+'--'+its(dstRect.Bottom); // valeurs ok // Etape 1 --> CREATION D'UN TBITMAP DE DESTINATION // jpt : sert à rien avec TImage/TBitmap, adaptation des dimensions, plutôt with imgDst do begin Width := dstRect.Right; Height := dstRect.Bottom; // si ligne pf dessous présente, alors image affichée noire, // indépendamment du pf de la source, 24 comme 32 ! // en jouant avec page préc/page suiv ça la fait apparaître. Picture.Bitmap.PixelFormat := imgSrc.Picture.Bitmap.PixelFormat; // LA LIGNE ! Picture.Bitmap.Width := Width; Picture.Bitmap.Height := Height; end; // Etape 2--> MODIFICATION DES DONNEES ORIGINELLES VERS LE TBITMAP DE DESTINATION SetStretchBltMode(imgDst.Picture.Bitmap.Canvas.Handle, HALFTONE); StretchBlt(imgDst.Picture.Bitmap.Canvas.Handle, 0, 0, imgDst.Picture.Bitmap.Width, imgDst.Picture.Bitmap.Height, imgSrc.Picture.Bitmap.Canvas.Handle, 0, 0, imgSrc.Picture.Bitmap.Width, imgSrc.Picture.Bitmap.Height, SRCCOPY); //if imgSrc.Picture.Bitmap.PixelFormat = pf32bit then ConvertToPF32(imgDst); imgDst.Picture.Bitmap.Canvas.Changed; // jpt mandatory sinon fichier vide dessous // Autres Etapes : imgDst.Picture.Bitmap.SaveToFile(chemin+'imgDst.bmp'); // fichier Dst en pf24 si Src 32, sans doute à cause du StrechBlt, d'où le Convert (à écrire) end;
Je vous fais grâce des fichiers exotiques, le problème est présent avec les valeurs standard 128x64.
Code : 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 procedure TForm1.FormCreate(Sender: TObject); var f: string; begin //f := ProgramDirectory+'embedded_xbr32.bmp'; //f := ProgramDirectory+'embedded_xbr24.bmp'; // lclci ok avec valeurs exotiques //f := ProgramDirectory+'embedded_xbr_127x63x32_vh1.bmp'; f := ProgramDirectory+'embedded_xbr_127x63x24_vh1.bmp'; // SRC -- setup srcRect dans Mitchelltask if not LoadFile(f) then begin ShowMessage('Erreur de chargement de ' + f + ', impossible de continuer.'); Exit; end; // pour récupérer de la place pour la copie if imgSrc.Width < pnl4display.ClientWidth then sboxSrc.ClientWidth := imgSrc.Width + imgSrc.Left+2; // +2 sinon HScrollBar visible à tort trkScaleChange(nil); end;
Partager