Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [DELPHI] Zoom immagine

  1. #1

    [delphi]zoom immagine


    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!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    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.

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

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Ciao Alka!
    In effetti mi sembra complicato,... nel frattempo sono arrivata a questo codice:
    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(imageCatastico.Width*1);
        ScrollBox1.HorzScrollBar.Range:=imageCatastico.picture.Width+trunc(imageCatastico.Width*1) ;
        scrollbox1.vertscrollbar.range:=imageCatastico.Picture.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)(?)

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Un po' di codice...

    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:
    codice:
    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 .

    Ciao,
    Marco.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    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!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.