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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| procedure TF_Image2.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
// Efface le rectangle de sélection et redessine l'image zoomée
Var
R1 : TRect ; // Rectangle de sélection
R2 : TRect ; // Rectangle de sélection adapté aux dimensions de Image1
Bmp : TBitMap ;
Bmp2 : TBitMap ;
begin
if (Button = mbLeft) then
Begin
DessineRECT;
R1 := MakeRect(PtDepart, PtArrivee) ;
PtDepart := R1.TopLeft ;
PtArrivee := R1.BottomRight ;
R1 := RetailleSel(R1, Image1.BoundsRect) ;
R2 := Image1.BoundsRect ;
Bmp := TBitmap.Create;
Bmp2 := TBitmap.Create;
Try
Bmp.Assign(Image1.Picture.Graphic);
Bmp2.Width := R2.Right - R2.Left ;
Bmp2.Height := R2.Bottom - R2.Top ;
Bmp2.Canvas.CopyRect(Bmp2.Canvas.ClipRect, Bmp.Canvas, R1);
Image1.Picture := Nil ;
Image1.Height := Bmp2.Height ;
Image1.Width := Bmp2.Width ;
Image1.Canvas.Draw(0, 0, Bmp2);
CentrerImage ;
FSelecting := False ;
Finally
Bmp.Free;
Bmp2.Free;
End ;
End ;
end;
{ ========================================================================== }
Function TF_Image2.RetailleSel(R1, R2 : TRect): TRect;
// R1 rectangle de sélection R2 Rectangle de Image1
// Retaille R1 pour être proportionnel à R2 et
// modifie PtDepart et PtArrivee pour rester dans R2
// PtDepart et PtArrivee ==> Rect resultat
Var
W1, H1, W2, H2 : Integer ;
W, H : Integer ; // Dimensions du nouveau rectangle de sélection R
Y : Real ;
R, RP : Real ;
DX, DY : Integer ;
Begin
W1 := R1.Right - R1.Left ;
H1 := R1.Bottom - R1.Top ;
W2 := R2.Right - R2.Left ;
H2 := R2.Bottom - R2.Top ;
R := W2 / W1 ;
RP := H2 / H1 ;
W := W1 ;
H := H1 ;
If R <= RP Then
Begin
// Expansion de R1 dans Image1 suivant W
H := Round(H2 * W1 / W2) ;
W := W1 ;
DY := Round((H - H1) / 2) ;
If (PtDepart.Y -DY) < 0 Then
Begin
// Rectangle trop haut
PtDepart.Y := 0 ;
PtArrivee.Y := H ;
End
Else
Begin
If (PtArrivee.Y + DY) > H2 Then
Begin
// Rectangle trop bas
PtArrivee.Y := H2 ;
PtDepart.Y := H2 - H ;
End
Else
Begin
// Rectangle contenu dans Image1
PtDepart.Y := PtDepart.Y - DY ;
PtArrivee.Y := PtArrivee.Y + DY ;
End ;
End ;
End
Else
Begin
// Expansion de R1 dans Image1 suivant H
W := Round(W2 * H1 / H2) ;
H := H1 ;
DX := Round((W - W1) / 2) ;
If (PtDepart.X -DX) < 0 Then
Begin
// Rectangle trop à gauche
PtDepart.X := 0 ;
PtArrivee.X := W ;
End
Else
Begin
If (PtArrivee.X + DX) > W2 Then
Begin
// Rectangle trop à droite
PtArrivee.X := W2 ;
PtDepart.X := W2 - W ;
End
Else
Begin
// Rectangle contenu dans Image1
PtDepart.X := PtDepart.X - DX ;
PtArrivee.X := PtArrivee.X + DX ;
End ;
End ;
End ;
Result := Rect(PtDepart.x,PtDepart.Y, PtArrivee.X,PtArrivee.Y) ;
End ;
{ ========================================================================== } |
Partager