PDA

Visualizza la versione completa : [DELPHI] Zoom immagine


vicky
16-12-2005, 12:16
:ciauz:
So che per fare lo zoom di un'immagine è necessario scaricare un componente aggiuntivo. Nel mio caso risulterebbe una procedura complicata, quindi mi domandavo se non fosse possibile realizzare ugualmente uno zoom semplice che mi permettesse di effettuare un unico ingrandimento (ad es. del 20%)cliccando sull'immagine con il tasto sinistro del mouse ed una riduzione cliccando sull'immagine con il tasto destro del mouse, agendo esclusivamente tramite codice.
Grazie!

alka
16-12-2005, 21:49
Se utilizzi un controllo TImage, sarebbe utile memorizzare l'immagine in un bitmap (convertendola) in memoria e, attraverso le funzionalità dell'oggetto Canvas (ad esempio, di una TPaintBox) gestire il tracciamento dell'immagine ingrandita (con il metodo StretchDraw) del Canvas sul controllo PaintBox dell'immagine bitmap, specificando dimensioni ingrandite.

Certo è un po' difficile spiegare il concetto o realizzarlo senza codice, ma per scrivere codice ci vorrebbe un bel pochino. :stordita:

Magari fai qualche tentativo o prova una ricerca con Google ben mirata.

Ciao! :ciauz:

vicky
16-12-2005, 22:00
Ciao Alka!
In effetti mi sembra complicato,... nel frattempo sono arrivata a questo codice:


procedure TCatasticoForm.ImageCatasticoMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

if button=mbleft then
ImageCatastico.autosize:=false;
imageCatastico.Height:=imageCatastico.Height+trunc (imageCatastico.Height*1);
imageCatastico.Width:=imageCatastico.Width+trunc(i mageCatastico.Width*1);
ScrollBox1.HorzScrollBar.Range:=imageCatastico.pic ture.Width+trunc(imageCatastico.Width*1) ;
scrollbox1.vertscrollbar.range:=imageCatastico.Pic ture.Height+trunc(imageCatastico.Height*1);

if button=mbright then
ImageCatastico.autosize:=true;
scrollbox1.autosize:=true;

end;

L'inconveniente è che tornando indietro con lo zoom la scrollbox non si ridimensiona come l'immagine ma rimane più grande(a meno che non prema due volte di seguito il button ds del mouse)(?)

alka
16-12-2005, 23:22
Io ho provato ad utilizzare un controllo TScrollBox con, al suo interno, in alto a sinistra, un controllo TImage in cui verrà caricata l'immagine.

Con un pulsante TButton si chiama una finestra di dialogo (componente TOpenPictureDialog) per selezionare il file da caricare; intercettando l'evento OnMouseUp del controllo TImage ridimensiono il controllo stesso ingrandendolo con il tasto sinistro, rimpicciolendolo con il tasto destro e infine ripristinandolo allo stato originale con il tasto centrale.

Questa è la parte rilevante del codice del form:


procedure TMainForm.LoadButtonClick(Sender: TObject);
begin
if OpenPictureDialog.Execute then
begin
SourceImage.Picture.LoadFromFile(OpenPictureDialog .FileName);
SourceImage.AutoSize := True;
end;
end;

procedure TMainForm.SourceImageMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
case Button of
mbLeft:
begin
SourceImage.AutoSize := False;
SourceImage.Stretch := True;
SourceImage.Width := Trunc(SourceImage.Width / 0.2);
SourceImage.Height := Trunc(SourceImage.Height / 0.2);
end;
mbMiddle:
begin
SourceImage.Stretch := False;
SourceImage.AutoSize := True;
end;
mbRight:
begin
SourceImage.AutoSize := False;
SourceImage.Stretch := True;
SourceImage.Width := Trunc(SourceImage.Width * 0.2);
SourceImage.Height := Trunc(SourceImage.Height * 0.2);
end;
end;
end;

Il tuo problema di "flickering grigio" è dovuto al fatto che, probabilmente, hai impostato a True la proprietà Tracking delle barre di scorrimento della TScrollBox e quindi l'immagine viene spostata "freneticamente" mentre scorri con le barre.

In quel caso, forse, sarebbe meglio appunto ricorrere ad un "TImage potenziato" con double buffering, come quello del package Graphics32 (http://www.g32.org/graphics32/index.html) .

Ciao,
Marco.

vicky
16-12-2005, 23:45
Inutile a dirsi: il tuo codice va molto meglio del mio! Adesso proverò ad informarmi sul TImage "potenziato" che, come consigli, potrebbe fare al caso mio. Ciao!

Loading