Newsgroup: it.comp.lang.delphi
Titolo: zoom immagine

Ciao!
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!

 tramite codice.
Guarda un po' in questa ricerca :
http://groups.google.it/group/it.comp.lang.delphi/browse_thread/thread/145ac6b5211cc7eb/8008bed4898ff1b5?q=zoom+immagine&rnum=2#8008bed4898ff1b5
Ciao.
Marco D.T.

Seguendo il link indicato ho scritto questa procedura:
procedure TForm.Image1Click(Sender: TObject);
begin
    image1.Height:=image1.Height+trunc(image1.Height*0.5);
    image1.Width:=image1.Width+trunc(image1.Width*0.5);
    ScrollBox1.HorzScrollBar.Range:=image1.picture.Width;
  scrollbox1.vertscrollbar.range:=image1.Picture.Height;
end;
Ho inoltre impostato la proprietà stretch del controllo TImage a True.
Non succede nulla quando clicco sopra l'immagine.
Cosa c'è che non va? 

Probabilmente non riesco a vedere l'effetto perché le mie immagini sono jpg 
mentre il codice è fatto per immagini bmp. Sto dicendo una cavolata? 


No, durante le operazioni in memoria usa una rappresentazione "piatta", che 
sia bmp o jpg o qualsiasi altro formato supportato da TImage.
Da me funziona cmq, anche con la jpg. 


Cosa vuol dire ? Scusate ma sto imparando e quindi ho bisogno di spiegazioni 
supplementari. Grazie. 

"vicky" <vvi...@NOSPAMvirgilio.it> ha scritto nel messaggio 
news:43a2c8c9$0$16211$4faf...@reader3.news.tin.it...

Ad esempio un'immagine jpg e' un formato copresso con perdita di 
informazioni (lossy), e la codifica e' abbastanza complessa. I byte 
risultanti dopo la codifica hanno poco a che fare con l'input (almeno per un 
umano).
Quindi quando un programma deve modificare l'immagine jpg deve *solitamente* 
prima riportarla ad una codifica trattabile dagli algoritmi (che ti ricordo 
essere fatti da umani!).
Una codifica semplice per il programmatore e' un array di byte ad esempio. 
Non so come funziona TImage ma penso che converta l'immagine ad un array di 
byte prima di applicare i suoi algoritmi (lo stretch in questo caso).
Comunque ai fini del tuo problema non centra molto.
Come ti ho detto da me funziona tranquillamente (non ho provato il codice 
della scrollbar pero', ma solo quello della modifica dell'altezza e 
larghezza).
L'immagine l'hai caricata con l'Object Inspector e la vedi nel Form?
e ti sei ricordato di mettere a true la proprieta' stretch?

 e ti sei ricordato di mettere a true la proprieta' stretch?
L'immagine viene prelevata da un db e piazzata nella scrollbox tramite 
codice
: io in esecuzione la vedo ma se clicco sopra col mouse non succede niente.
Ovviamente ho settato a true la proprietą stretch. La qualitą di questo 
ingrandimento č decente? Le mie immagini sono pagine di testi digitalizzati 
e l'ingrandimento mi serve per leggere anche caratteri molto piccoli. 

Credo che il problema sia nel fatto che il mio controllo Timage ha la 
proprietà autosize settata su true per ottenere che occupi tutta la 
scrollbox. Se metto tale proprietà a false ottengo l'ingrandimento 
desiderato, ma l'effetto finale non è quello che mi serve: ho bisogno 
infatti di vedere subito l'immagine  a tutto schermo e poi fare max 1-2 
ingrandimenti per distinguere i caratteri piccoli. Forse tutto questo è 
controllabile con il codice? 

"vicky" <vvi...@NOSPAMvirgilio.it> ha scritto nel messaggio 
news:43a2d0a2$0$16211$4faf...@reader3.news.tin.it...

con autosize a true non puoi ridimensionare l'immagine da quello che ho 
visto.
Quindi prova a caricarla con autosize settato a true, e poi nell'evento 
onclick settala a false.
Dovrebbe andare.

Va!
ma come faccio a ridimensionare l'immagine con il tasto destro del mouse 
una volta che l'ho ingrandita? Non riesco a trovare il codice giusto da 
scrivere. Pensavo di fare una cosa tipo:
procedure TForm.Image1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if button=mbleft then
    image1.Height:=image1.Height+trunc(image1.Height*1);
    image1.Width:=image1.Width+trunc(image1.Width*1);
    ScrollBox1.HorzScrollBar.Range:=image1.picture.Width ;
    scrollbox1.vertscrollbar.range:=image1.Picture.Height;
else....?? oppure if button =mbright then....
  end; 

"vicky" <vvi...@NOSPAMvirgilio.it> ha scritto nel messaggio 
news:43a31a56$0$16216$4faf...@reader3.news.tin.it...

if button = mbLeft then
...
else if button = mbRight then
Se con il tasto destro vuoi tornare all'originale penso ti basi un
image1.autosize = true; 

 image1.autosize = true;
Non basta, comunque andrebbe bene anche tornare all'ingrandimento 
precedente, non per forza all'ingrandimento iniziale.
Volevo chiederti: anche se riuscissi a risolvere questo problema rimane il 
fatto che quando faccio lo scroll dell'immagine ingrandita ho un effetto 
sgradevole che assomiglia a una fascia di tonalità grigiastra che si sposta 
dall'alto verso il basso man mano che scorre il margine superiore 
dell'immagine. E' forse dovuto al fatto che utilizzo un'immagine jpg e non 
bmp? 

vicky ha scritto:

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;
Certo, l'esempio può essere ottimizzato, curato, semplificato e 
migliorato (con centrature e altro), ma dovrebbe dare un'idea del 
"concept". Forse non è nemmeno troppo diverso dall'esempio che ti è 
stato suggerito (non l'ho controllato).
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.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)