Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 39
  1. #11
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Ciao, ti ho buttato giù un piccolo esempio sia per zoomare che per il pan..
    Probabilmente il codice, pur se l'ho commentato poco poco , non ti sarà del tutto comprensibile, comunque magari, anche se poco, ti può essere di aiuto. E' solo un esempio dal quale devi prendere spunto e migliorare il tutto man mano che acquisirai più esperienza, anche leggendo libri. L'ideale sarebbe astrarre il tutto e crearti una classe o meglio un ocx..se avrai voglia e tempo da dedicare alla programmazione, arriverai anche a questo.

    Allora per questo esempio ti servono:
    2 optionButton
    1 VScrollBar
    1 HScrollBar
    3 PictureBox


    Una pictureBox la chiami picBase (le dimensioni le decidi tu, considera che è la base di appoggio usata per visualizzare le immagini), un'altra pictureBox la inserisci all'interno della picBase e la chiami picView (sarà l'oggetto che conterrà l'immagine), mentre l'ultima pictureBox la chiami picBuff (la puoi fare anche piccolissima) e la posizione in un punto qualunque del form.
    Per quanto riguarda la picView impostare le proprietà AutoRedraw=True e BorderStyle=0-None
    Mentre per la picBuff imposta la proprietà Visible=False


    Una optionButton la chiami optZoom e l'altra optPan (in base a quale selezioni, il mouse fa la funzione di zoom o pan) Se sarà selezionato l'opzione di zoom, cliccando con il tasto destro l'immagine si riduce, mentre con il tasto sinistro si ingrandisce. Mentre se si seleziona l'opzione di pan, tenendo premuto il tasto sinistro del mouse sopra l'immagine muoviamo l'immagine stessa.


    La VScrollBar la chiami picVscroll , e la HScrollBar la chiami picHscroll (le posizioni rispettivamente alla destra e alla base della picBase

    Ti allego l'immagine di come dovrebbe venire..

    e questo è il codice:

    codice:
    Private Const OFFSET_ZOOM = 10
    
    Dim clickX As Single
    Dim clickY As Single
    Dim valPercZoom As Double
    
    'passare il percorso completo di nome immagine da caricare
    Private Sub CaricaImmagine(pathImg As String)
       picBuff.Picture = LoadPicture(pathImg)
       
       'visualizza l'immagine alla percentuale di default (100%)
       Zoom valPercZoom
    End Sub
    
    'centra l'immagine sulla base di visualizzazione (picBase)
    Private Sub CentraPic(pW As Single, pH As Single)
       picView.Move (picBase.Width - pW) / 2, (picBase.Height - pH) / 2, pW, pH
    End Sub
    
    'Per settare le barre di scorrimento in base alla grandezza dell'immagine
    Private Sub SetPicScroll(maxHeight As Single, maxWidth As Single)
       If maxHeight > picBase.Height Then
          picVscroll.Visible = True
          picVscroll.Max = (maxHeight - picBase.Height)
          picVscroll.Value = Abs(picView.Top)
       Else
          picVscroll.Visible = False
       End If
       If maxWidth > picBase.Width Then
          picHscroll.Visible = True
          picHscroll.Max = (maxWidth - picBase.Width)
          picHscroll.Value = Abs(picView.Left)
       Else
          picHscroll.Visible = False
       End If
    End Sub
    
    'per zoommare l'immagine
    Private Sub Zoom(percZoom As Double)
       Dim H As Single
       Dim W As Single
       
       'calcola le nuove dimensioni dell'immagine
       W = picBuff.Picture.Width * (percZoom / 100)
       H = picBuff.Picture.Height * (percZoom / 100)
       
       'cancella l'immagine che c'era prima
       picView.Cls
       'centra la base di visualizzazione dell'immagine (picView
       CentraPic W, H
       'ridisegna l'immagine con le nuove dimensioni
       picView.PaintPicture picBuff.Picture, 0, 0, W, H
       'imposta le barre di scorrimento
       SetPicScroll H, W
    End Sub
    
    'per spostare l'immagine con l'opzione pan
    'se le barre di scorrimento non sono visibili, non c'è nessun spostamento..
    'Altrimenti calcola la nuova posizione e riposizione sia le barre di scorrimento che l'immagine..
    Private Sub MovePicture(posX As Single, posY As Single)
       Dim newPosX As Single
       Dim newPosY As Single
       If picHscroll.Visible Then
          newPosX = picView.Left - (clickX - posX)
          If newPosX > 0 Then
             newPosX = 0
          ElseIf Abs(newPosX) > picHscroll.Max Then
             newPosX = -picHscroll.Max
          End If
          picHscroll.Value = Abs(newPosX)
          picView.Left = newPosX
       End If
       If picVscroll.Visible Then
          newPosY = picView.Top - (clickY - posY)
          If newPosY > 0 Then
             newPosY = 0
          ElseIf Abs(newPosY) > picVscroll.Max Then
             newPosY = -picVscroll.Max
          End If
          picVscroll.Value = Abs(newPosY)
          picView.Top = newPosY
       End If
    End Sub
    
    Private Sub Form_Load()
       picHscroll.Min = 0
       picVscroll.Max = 0
       optZoom.Value=True
       valPercZoom = 100
       CaricaImmagine "c:\immagine.jpg"
    End Sub
    
    Private Sub picHscroll_Change()
       picView.Left = -picHscroll.Value
    End Sub
    
    Private Sub picView_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If optPan.Value Then
          If (Button = vbKeyLButton) Then
             'salva il punto iniziale dove si è fatto click con il mouse
             'per calcolare l'offset di scostamento dai margini dell'immagine da spostare..
             clickX = X
             clickY = Y
          End If
       End If
    End Sub
    
    Private Sub picView_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If (Button = vbKeyLButton) And (optPan.Value) And (picHscroll.Visible Or picVscroll.Visible) Then
          MovePicture X, Y
       End If
    End Sub
    
    Private Sub picView_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If optZoom.Value Then
          'gli incrementi/decrementi per zoommare sono impostati con la costante OFFSET_ZOOM
          If (Button = vbKeyLButton) Then
             valPercZoom = valPercZoom + OFFSET_ZOOM
          ElseIf (Button = vbKeyRButton) Then
             valPercZoom = valPercZoom - OFFSET_ZOOM
             If valPercZoom < OFFSET_ZOOM Then
                valPercZoom = OFFSET_ZOOM
             End If
          End If
          Zoom valPercZoom
       End If
    End Sub
    
    Private Sub picVscroll_Change()
       picView.Top = -picVscroll.Value
    End Sub
    Immagini allegate Immagini allegate
    Jupy

  2. #12
    Formidabile! Adesso sono troppo stanca per analizzarlo, ma domani mi metto al'opera. Spero che questo mi aiuti a velocizzare un po' il mio studio, perché sui libri non ho trovato nessun riferimento al pan di immagine e neanche in rete.

  3. #13
    Funziona molto bene! Sto studiando le varie porzioni di codice e tutto ieri sono rimasta ferma su un punto:
    codice:
    Private Sub picView_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If optZoom.Value Then
          'gli incrementi/decrementi per zoommare sono impostati con la costante OFFSET_ZOOM
          If (Button = vbKeyLButton) Then
             valPercZoom = valPercZoom + OFFSET_ZOOM
          ElseIf (Button = vbKeyRButton) Then
             valPercZoom = valPercZoom - OFFSET_ZOOM
             If valPercZoom < OFFSET_ZOOM Then
                valPercZoom = OFFSET_ZOOM
             End If
          End If
          Zoom valPercZoom
       End If
    End Sub

    Come posso limitare anche l'ingrandimento visto che il decremento viene bloccato quando valPercZoom = OFFSET_ZOOM?
    Ho fissato la dimensione di partenza a 20 (=valPercZoom) e gli incrementi sono di 10 in 10 (=OFFSET_ZOOM). Mi sarebbe sufficiente se la dimensione massima raggiungibile fosse 50. Solo che non vorrei vedere la schermata di errore 'Overflow', ma l'immagine dovrebbe semplicemente non ingrandirsi di più. Ho provato a fissare una costante OFFSET_MAX = 50 ma non cambia niente.
    codice:
    Private Const  OFFSET_MAX=50
    
    ...If valPercZoom < OFFSET_ZOOM Then
                valPercZoom = OFFSET_ZOOM
       Else if valPercZoom > OFFSET_MAX Then
                valPercZoom = OFFSET_MAX
          End If
        End If
          Zoom valPercZoom
       End If
    End Sub

  4. #14
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Ciao, prova cosi:
    codice:
    Private Const  ZOOM_MAX=50
    
    Private Sub picView_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
       If optZoom.Value Then
          If (Button = vbKeyLButton) Then
             valPercZoom = valPercZoom + OFFSET_ZOOM
             If valPercZoom > ZOOM_MAX Then
                valPercZoom = ZOOM_MAX
             End If
          ElseIf (Button = vbKeyRButton) Then
             valPercZoom = valPercZoom - OFFSET_ZOOM
             If valPercZoom < OFFSET_ZOOM Then
                valPercZoom = OFFSET_ZOOM
             End If
          End If
          Zoom valPercZoom
       End If
    End Sub
    Jupy

  5. #15
    Grazie, ovviamente funziona! (e sono riuscita a capire dove sbagliavo)

  6. #16
    Capisco che "riesumare" una discussione così antica non vada bene ma ci sono tutti i riferimenti utili ed io in effetti sono rimasta a quel punto. Un meccanismo funzionante, ma mi chiedevo se non fosse possibile fare in modo che cliccando sull'immagine, per ottenerne lo zoom, l'ingrandimento fosse centrato sul punto dove il mouse clicca.
    Grazie!

  7. #17
    Utente di HTML.it L'avatar di LMondi
    Registrato dal
    Sep 2004
    Messaggi
    1,291
    I miei complimenti a Jupy64,
    il suo codice è veramente interessante.
    Chi sà se riesce anche a fare quello che chiede ulteriormente vicky ?
    Sarebbe strabiliante !!
    LM

  8. #18
    beh ... ho solo una nota da fare

    ricordatevi che nel caso di immaggini di GROSSA dimensione non si possono utilizzare questi sistemi perché collasserebbe completamente il sistema


    utilizzando il VB.NET già c'è qualche speranza in più sia tramite l'utilizzo di un doublebuffer, ovviamente da implementare ma abbastanza semplice (se non dovete eseguire nessun tipo di operazioni grafiche allora il doublebuffer è l'immagine stessa da visualizzare) e dell'accesso diretto alla memoria dell'oggetto grafico

    l'oggetto Bitmap mette a disposizione dei metodi per accedere alla memoria e copiare byte per byte dell'immagine in modo da eseguire la copia in modo estremamente veloce!
    Infatti disegnare delle immagini di grossa dimensione (o estremamente zoommate) può risultare un'operazione molto pesante, infatti lo zoom, implementato anche tramite questo sistema (parlo del semplice ridimensionamento dei pixel), permette tempi di esecuzione estremamente ridotti. Sono riuscito a eseguire perfettamente pan/zoom di un'immagine grande 6800x9000px su un pIII 700mhz con 128 di ram e windows 2000 (il codice era in C# ma con vb.net non cambia molto)

    ------

    tornanado al quesito di vicky ... la cosa non è molto complessa

    quando ridimensioni viene ridimensionata l'intera immagine quindi ti basta "ridimensionare" con la stessa formula anche la posizione corrente ed otterrai la nuova posizione di destinazione ... aggiorni il value delle scrollbar e hai centrato l'immagine
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  9. #19
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Ciao, quello che dice daniele_dll è giusto, quel codice che ho postato è chiaro che va ottimizzato. Ho cercato di renderlo il più semplice possibile per vicky, in quanto le sue conoscenze di vb non erano approfondite..ma era agli inizi.
    Per quanto riguarda questa ulteriore modifica che chiedi, vedi se riesci a mettere in pratica l'aiuto che ti ha dato daniele.. altrimenti vedo di buttarti giù qualcosa... ma ora non posso..
    Jupy

  10. #20
    Ti ringrazio ancora per l'aiuto datomi in passato.
    Sto ragionando sullo "spunto" datomi da Daniele_dll ma finora non ho ottenuto grandi risultati. Se avrai tempo e voglia nei prossimi giorni farò tesoro dei tuoi suggerimenti

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 © 2026 vBulletin Solutions, Inc. All rights reserved.