Autore Topic: [RISOLTO] Scalare le dimensioni di una immagine in modo proporzionale  (Letto 1623 volte)

Offline ilfurlan

  • Grande Gambero
  • ***
  • Post: 111
    • Mostra profilo
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 !
« Ultima modifica: 15 Marzo 2017, 10:29:50 da ilfurlan »
Non insegno ma imparo per riportare ad altri il mio sapere.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #1 il: 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
 
« Ultima modifica: 02 Marzo 2017, 23:29:43 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline ilfurlan

  • Grande Gambero
  • ***
  • Post: 111
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #2 il: 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?
Non insegno ma imparo per riportare ad altri il mio sapere.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #3 il: 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
« Ultima modifica: 03 Marzo 2017, 01:58:01 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline ilfurlan

  • Grande Gambero
  • ***
  • Post: 111
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #4 il: 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 !!!
Non insegno ma imparo per riportare ad altri il mio sapere.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #5 il: 03 Marzo 2017, 00:37:06 »
Incredibile, è notte e sei ancora qui a rispondere....

...ma solo se le domande sono chiare.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #6 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline ilfurlan

  • Grande Gambero
  • ***
  • Post: 111
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #7 il: 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
Non insegno ma imparo per riportare ad altri il mio sapere.

Offline ilfurlan

  • Grande Gambero
  • ***
  • Post: 111
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #8 il: 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
Non insegno ma imparo per riportare ad altri il mio sapere.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #9 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline ilfurlan

  • Grande Gambero
  • ***
  • Post: 111
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #10 il: 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)
Non insegno ma imparo per riportare ad altri il mio sapere.

Offline Arco

  • Gambero
  • **
  • Post: 93
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #11 il: 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

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #12 il: 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.
« Ultima modifica: 03 Marzo 2017, 12:14:32 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline ilfurlan

  • Grande Gambero
  • ***
  • Post: 111
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #13 il: 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.
Non insegno ma imparo per riportare ad altri il mio sapere.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Scalare le dimensioni di una immagine in modo proporzionale
« Risposta #14 il: 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 !
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »