Sono riuscito a scalare le dimensioni di una immagine con questo codice
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 !
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
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?
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ì:
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
adesso funziona, basta togliere .Width e .Height dopo ImageStat
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
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?)
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)
$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ì:
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
Senza entrare nel merito del programma, se si desidera salvare un'immagine scalata, potete fare così:
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.