Immagine & canvas

Buonasera,
Innanzitutto devo ringraziare Antonio per i suoi sempre più preziosi aiuti.

Ho una finestra con un componente canvas che devo poter visualizzare con la dimensione della larghezza in base al canvas e l’altezza proporzionata, anche se ovviamente l’immagine verrà tagliata.
Devo poter poi spostare l’immagine nel cavas con la barra di scorrimento verticale eventualmente

L’immagine anche se visualizzata a 100 x 200 pixel vorrei fosse però esportata in formato A4 con 300 dpi di risoluzione, in pratica (2480 pixel x 3507 pixel)
Invece per adesso la esporto con la dimensione del canvas.

Puoi generare l’immagine delle dimensioni desiderate (grandi) e disegnarci dentro in modo assoluto.
Puoi generare l’immagine nelle dimensioni che ti servono al momento (piccola per il desktop, grande per salvare/stampare) e disegnarci dentro in modo relativo.

Sta a te e a come generi l’immagine.

Per visualizzarla nel canvas (anche se molto grande) nel paint:

  • calcola la scala, visto che vuoi tenerla a larghezza canvas prendi questo come riferimento
  • calcoli la larghezza (che appunto quello del canvas) e l’altezza (scala*immagine.height) che andrai a utilizzare
    -aggiorni il massimo della scrollbar alla differenza tra l’altezza del canvas e questa immagine calcolata
    -disegni l’immagine con:
    g.DrawPicture p,0,-ScrollBar1.Value,w,h,0,0,p.Width,p.Height

ovvero scalata e spostata dell’inverso del valore della scrollbar.

Volendo puoi verificare che se l’altezza minore del canvas allora la scrollbar non deve apparire

Ho preso l’esempio di Xojo ‘Canvas Scrolling’
Ho creato la propriet magnifier as integer = 100
in Open della finestra o quando assegno l’immagine alla variabile ho inserito

magnifier = round((ScrollingCanvas.Width / mImage.Width) * 100)

In questo modo visualizzo l’immagine ingrandita o rimpicciolita in base alla dimensione orizzontale

Sull’evento mouseweel del canvas ho messo :

magnifier = magnifier + deltay
  me.Invalidate

In questo modo con la rotellina del mouse posso ingrandire/ridurre l’immagine ( zoom in / zoom out )

E invece nel paint ho fatto questa modifica :

  dim xzoom, yzoom as integer
  xzoom = round(mImage.Width * magnifier / 100)
  yzoom = round(mImage.Height * magnifier / 100)
  g.DrawPicture(mImage, mXScroll, mYScroll, xzoom, yzoom,0,0,mImage.Width,mImage.Height)

Che permette di gestire sia lo scroll con le barre di scorrimento che lo zoom dell’immagine …
Nella MouseWheel della barra di scorrimento orizzontale ho poi modificato il codice come segue :

  // compatibilit con trackpad e magic mouse
  #if TargetMacOS 
    Me.Value = Me.Value + deltaX
    Return True
  #else
    Me.Value = Me.Value + deltaY
    Return True
  #endif

In questo modo posso agire sulla barra anche con le gesture del trackpad o del magic mouse.

Grazie ancora Antonio per la soluzione al problema.