Gambas-it

Gambas3 => Programmazione => Topic aperto da: ilfurlan - 02 Marzo 2017, 22:37:22

Titolo: [RISOLTO] Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: ilfurlan - 02 Marzo 2017, 22:37:22
Sono riuscito a scalare le dimensioni di una immagine con questo codice

Codice: [Seleziona]
Dim $ImScala As Image
Dim $ImScalata As Image

$ImScala = Image.Load(User.Home &/ "MyReport/MyLogo.png")
$ImScalata = $ImScala.Stretch(150, 100)
$ImScalata.Save(User.Home &/ "MyReport/MyLogo.png", 100)

il problema è che vorrei indicare il valore della larghezza a 150, ma non indicare l'altezza 100 che deve ridimensionarsi in maniera proporzionale.

Esempio:
una immagine L 1600 x H 1200 deve diventare L 150 x H 113

Grazie !
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: vuott - 02 Marzo 2017, 23:27:18
Restando al tuo esempio, direi:

la Larghezza originale sta alla larghezza scalata come l'altezza originale sta all'altezza scalata incognita.

 h = (1200 * 150) / 1600   :-X
 
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: ilfurlan - 03 Marzo 2017, 00:09:50
Restando al tuo esempio, direi:

la Larghezza originale sta alla larghezza scalata come l'altezza originale sta all'altezza scalata incognita.

 h = (1200 * 150) / 1600   :-X
 

 :-[ lezione di matematica e non di informatica... grazie !!!

Per trovare h devo conoscere larghezza e altezza, ho provato ad interrogare l'immagine con
Codice: [Seleziona]
Dim l As Integer
Dim h As Integer

  l = ImageStat.Width(User.Home &/ "MyReport/.MyLogo.png")
  h = ImageStat.Height(User.Home &/ "MyReport/.MyLogo.png")

  Print l
  Print h
ma non funziona, cosa sbaglio?
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: vuott - 03 Marzo 2017, 00:22:28
ma non funziona, cosa sbaglio?
Devi utilizzare "ImageStat" come funzione statica, ed in particolare le previste proprietà dell'oggetto di tipo ImageStat, da essa ritornato.

Più brevemente insomma così:

Codice: [Seleziona]
Dim l As Integer
Dim h As Integer

  l = ImageStat(User.Home &/ "MyReport/.MyLogo.png").Width
  h = ImageStat(User.Home &/ "MyReport/.MyLogo.png").Height

  Print l
  Print h
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: ilfurlan - 03 Marzo 2017, 00:35:26
ma non funziona, cosa sbaglio?
Devi utilizzare "ImageStat" come funzione statica, ed in particolare le previste proprietà dell'oggetto di tipo ImageStat, da essa ritornato.

Più brevemente insomma così:

Codice: [Seleziona]
Dim l As Integer
Dim h As Integer

  l = ImageStat.Width(User.Home &/ "MyReport/.MyLogo.png").Width
  h = ImageStat.Height(User.Home &/ "MyReport/.MyLogo.png").Height

  Print l
  Print h


Incredibile, è notte e sei ancora qui a rispondere.... Grazie !!!
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: vuott - 03 Marzo 2017, 00:37:06
Incredibile, è notte e sei ancora qui a rispondere....

...ma solo se le domande sono chiare.
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: vuott - 03 Marzo 2017, 00:41:58
Qualora tu abbia dichiarato guerra alla Classe "ImageStat",  e l'immagine sia del formato PNG, puoi ricavare la Larghezza (width) e l'Altezza (Height) dell'immagine leggendo detti valori di tipo Integer rispettivamente nel 16° e nel 20° byte del predetto file, ricordando che tali valori sono lì contenuti nell'ordine Big-Endian.
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: ilfurlan - 03 Marzo 2017, 01:12:16
ma non funziona, cosa sbaglio?
Devi utilizzare "ImageStat" come funzione statica, ed in particolare le previste proprietà dell'oggetto di tipo ImageStat, da essa ritornato.

Più brevemente insomma così:

Codice: [Seleziona]
Dim l As Integer
Dim h As Integer

  l = ImageStat.Width(User.Home &/ "MyReport/.MyLogo.png").Width
  h = ImageStat.Height(User.Home &/ "MyReport/.MyLogo.png").Height

  Print l
  Print h

Non mi funziona, dice:

ImageStat.Whidth is not static
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: ilfurlan - 03 Marzo 2017, 01:20:03
adesso funziona, basta togliere .Width e .Height dopo ImageStat
Codice: [Seleziona]
Dim l As Integer
Dim h As Integer

  l = ImageStat(User.Home &/ "MyReport/.MyLogo.png").Width
  h = ImageStat(User.Home &/ "MyReport/.MyLogo.png").Height

  Print l
  Print h
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: vuott - 03 Marzo 2017, 02:00:32
Sì, hai fatto bene a ricontrollare: invece di ricopiare dal mio codice dall'IDE di Gambas, io ho ripreso il tuo primo aggiungendoci le due proprietà.

Per non fuorviare i lettori, ho opportunamente modificato nella forma corretta il codice da me sopra riportato.
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: ilfurlan - 03 Marzo 2017, 10:05:39
Per concludere ho provato a mettere assieme le due parti di codice, in modo da avere alla fine una immagine scalata in maniera proporzionale ma con dimensioni massime di larghezza e altezza prestabilite,
ma, non salva l'immagine ridimensionata e non capisco perchè (è un errore di codice o per altri motivi? devo abilitare qualche componente?)

Codice: [Seleziona]
Public Sub Button1_Click()

Dim $ImLarghezza As Integer
Dim $ImAltezza As Integer
Dim $Incognita As Integer 'incognita per trovare la larghezza o l'altezza da scalare proporzionalmente
Dim $ImScala As Image
Dim $ImScalata As Image

  $ImLarghezza = ImageStat(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg").Width 'legge la larghezza dell'immagine
  If $ImLarghezza > 350 Then 'controlla se è superiore a quella voluta
  $Incognita = ($ImAltezza * 350) / $ImLarghezza 'calcola la giusta altezza proporzionale
  $ImScala = Image.Load(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg") 'legge l'immagine
  $ImScalata = $ImScala.Stretch(350, $Incognita) 'scala l'immagine con il valore dato all'altezza
  $ImScalata.Save(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg", 100) 'salva l'immagine scalata
  Endif

  $ImAltezza = ImageStat(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg").Height 'legge la altezza dell'immagine
  If $ImAltezza > 150 Then 'controlla se è superiore a quella voluta
  $Incognita = ($ImLarghezza * 150) / $ImAltezza 'calcola la giusta larghezza proporzionale
  $ImScala = Image.Load(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg") 'legge l'immagine
  $ImScalata = $ImScala.Stretch($Incognita, 150) 'scala l'immagine con il valore dato alla larghezza
  $ImScalata.Save(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg", 100) 'salva l'immagine scalata
  Endif

  PictureBoxScalata.Picture = Picture.Load(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg")

End

Tutto questo l'ho provato nel programmino in allegato (da scompattare nella Home)
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: Arco - 03 Marzo 2017, 11:45:45
Codice: [Seleziona]
  $ImLarghezza = ImageStat(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg").Width 'legge la larghezza dell'immagine
  If $ImLarghezza > 350 Then 'controlla se è superiore a quella voluta
  $Incognita = ($ImAltezza * 350) / $ImLarghezza 'calcola la giusta altezza proporzionale
Premesso che non ho gambas installato su questo computer e non posso fare dei test.
Quando cerchi di calcolare  $Incognita non ottieni un risultato valido perchè $ImAltezza non è ancora definita (valore 0).
Prova a modificare il codice così:
Codice: [Seleziona]
Public Sub Button1_Click()

Dim $ImLarghezza As Integer
Dim $ImAltezza As Integer
Dim $Incognita As Integer 'incognita per trovare la larghezza o l'altezza da scalare proporzionalmente
Dim $ImScala As Image
Dim $ImScalata As Image

  $ImLarghezza = ImageStat(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg").Width 'legge la larghezza dell'immagine

  $ImAltezza = ImageStat(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg").Height 'legge la altezza dell'immagine

  If $ImLarghezza > 350 Then 'controlla se è superiore a quella voluta
  $Incognita = ($ImAltezza * 350) / $ImLarghezza 'calcola la giusta altezza proporzionale
  $ImScala = Image.Load(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg") 'legge l'immagine
  $ImScalata = $ImScala.Stretch(350, $Incognita) 'scala l'immagine con il valore dato all'altezza
  $ImScalata.Save(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg", 100) 'salva l'immagine scalata
  Endif

  If $ImAltezza > 150 Then 'controlla se è superiore a quella voluta
  $Incognita = ($ImLarghezza * 150) / $ImAltezza 'calcola la giusta larghezza proporzionale
  $ImScala = Image.Load(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg") 'legge l'immagine
  $ImScalata = $ImScala.Stretch($Incognita, 150) 'scala l'immagine con il valore dato alla larghezza
  $ImScalata.Save(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg", 100) 'salva l'immagine scalata
  Endif

  PictureBoxScalata.Picture = Picture.Load(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg")

End
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: Gianluigi - 03 Marzo 2017, 11:57:13
Senza entrare nel merito del programma, se si desidera salvare un'immagine scalata, potete fare così:
Codice: [Seleziona]
  Dim immagine, imLav As Image
  Dim alt, larg As Integer
  Dim sPathOrig, sPathDest As String
  ' Inserire un'immagine e una path esistente
  sPathOrig = "~/Immagini/Mr._Sparkle.png"
  sPathDest = "~/Immagini/Mr._Sparkle_Piccolo.png"
  immagine = Image.Load(sPathOrig) 
  alt = immagine.H \ 3
  larg = immagine.W \ 3
  immagine = immagine.Stretch(larg, alt)
  imLav = New Image(larg, alt)
  immagine = imLav.DrawImage(immagine, 0, 0, larg, alt) 
  immagine.Save(sPathDest)
Ma questo serve per inserire modifiche, rivedendo quanto ha scritto Arco, direi che ha ragione lui.
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: ilfurlan - 03 Marzo 2017, 12:28:31
Codice: [Seleziona]
  $ImLarghezza = ImageStat(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg").Width 'legge la larghezza dell'immagine
  If $ImLarghezza > 350 Then 'controlla se è superiore a quella voluta
  $Incognita = ($ImAltezza * 350) / $ImLarghezza 'calcola la giusta altezza proporzionale
Premesso che non ho gambas installato su questo computer e non posso fare dei test.
Quando cerchi di calcolare  $Incognita non ottieni un risultato valido perchè $ImAltezza non è ancora definita (valore 0).
Prova a modificare il codice così:
Codice: [Seleziona]
Public Sub Button1_Click()

Dim $ImLarghezza As Integer
Dim $ImAltezza As Integer
Dim $Incognita As Integer 'incognita per trovare la larghezza o l'altezza da scalare proporzionalmente
Dim $ImScala As Image
Dim $ImScalata As Image

  $ImLarghezza = ImageStat(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg").Width 'legge la larghezza dell'immagine

  $ImAltezza = ImageStat(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg").Height 'legge la altezza dell'immagine

  If $ImLarghezza > 350 Then 'controlla se è superiore a quella voluta
  $Incognita = ($ImAltezza * 350) / $ImLarghezza 'calcola la giusta altezza proporzionale
  $ImScala = Image.Load(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg") 'legge l'immagine
  $ImScalata = $ImScala.Stretch(350, $Incognita) 'scala l'immagine con il valore dato all'altezza
  $ImScalata.Save(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg", 100) 'salva l'immagine scalata
  Endif

  If $ImAltezza > 150 Then 'controlla se è superiore a quella voluta
  $Incognita = ($ImLarghezza * 150) / $ImAltezza 'calcola la giusta larghezza proporzionale
  $ImScala = Image.Load(User.Home &/ "ScalaImmagine/ImmagineOriginale.jpg") 'legge l'immagine
  $ImScalata = $ImScala.Stretch($Incognita, 150) 'scala l'immagine con il valore dato alla larghezza
  $ImScalata.Save(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg", 100) 'salva l'immagine scalata
  Endif

  PictureBoxScalata.Picture = Picture.Load(User.Home &/ "ScalaImmagine/ImmagineScalata.jpg")

End

Perfetto, questo funziona ed ottengo esattamente il risultato voluto.
Intanto, per chi vuole provare allego questo esempio funzionante da scompattare nella Home, poi provo il suggerimento di Gianluigi per capire la differenza.
Titolo: Re:Scalare le dimensioni di una immagine in modo proporzionale
Inserito da: vuott - 03 Marzo 2017, 14:43:06
Per ottenere i valori della larghezza e dell'altezza dell'immagine caricata in una variabile di tipo Image, è ridondante interrogare le proprietà .Width e Height della Classe ImageStat. E', infatti, sufficiente leggere i valori delle analoghe proprietà .Width e Height della Classe Image !