Il linguaggio Visual Basic di Microsoft
 

funzione drawimage

NickBi 11 Feb 2015 15:38
Ciao a tutti,
ho realizzato un programmino che tramite la funzione drawimage sincronizza e
ridimensiona delle foto da una cartella ad un'altra e la destinazione è in
formato 640xY dove Y dipende dall'altezza della foto originale.
Visto che molto spesso, l'altezza varia ed ho necessità che la dimensione delle
foto sia sempre 640x480 senza dover distorcere l'immagine, sapreste dirmi se la
funzione drawimage ha la possibilità di inserire una fascia bianca aggiuntiva
pari ai pixel mancanti per raggiungere l'altezza di 480px?

grazie!
Luca D 11 Feb 2015 16:23
Il giorno mercoledì 11 febbraio 2015 15:38:35 UTC+1, NickBi ha scritto:
> Ciao a tutti,
> ho realizzato un programmino che tramite la funzione drawimage sincronizza e
ridimensiona delle foto da una cartella ad un'altra e la destinazione è in
formato 640xY dove Y dipende dall'altezza della foto originale.
> Visto che molto spesso, l'altezza varia ed ho necessità che la dimensione
delle foto sia sempre 640x480 senza dover distorcere l'immagine, sapreste dirmi
se la funzione drawimage ha la possibilità di inserire una fascia bianca
aggiuntiva pari ai pixel mancanti per raggiungere l'altezza di 480px?
>
> grazie!

Parliamo di VB.NET, giusto ? (sono un po' arruginito, non ricordo se in VB6
c'era una funzione DrawImage()... )

se parliamo di .NET, allora, assumendo che "Immagine1.png" sia più piccola di
648*480, questo la inserisce al centro di una cornice bianca (e di conseguenza,
se è 640*Y crea solo le bande sopra e sotto):

Dim sourceBMP As New Drawing.Bitmap("C:\Immagine1.png")
Dim destBMP As New Drawing.Bitmap(640, 480)
Dim destGraph As Drawing.Graphics
Dim destX As Int32
Dim destY As Int32

destGraph = Drawing.Graphics.FromImage(destBMP)
destGraph.Clear(Drawing.Color.White)
destX = Convert.ToInt32((640 - sourceBMP.Width) / 2)
destY = Convert.ToInt32((480 - sourceBMP.Height) / 2)
destGraph.DrawImage(sourceBMP, New Point(destX, destY))
NickBi 11 Feb 2015 18:27
Il giorno mercoledì 11 febbraio 2015 16:23:20 UTC+1, Luca D ha scritto:
> Il giorno mercoledì 11 febbraio 2015 15:38:35 UTC+1, NickBi ha scritto:
>> Ciao a tutti,
>> ho realizzato un programmino che tramite la funzione drawimage sincronizza e
ridimensiona delle foto da una cartella ad un'altra e la destinazione è in
formato 640xY dove Y dipende dall'altezza della foto originale.
>> Visto che molto spesso, l'altezza varia ed ho necessità che la dimensione
delle foto sia sempre 640x480 senza dover distorcere l'immagine, sapreste dirmi
se la funzione drawimage ha la possibilità di inserire una fascia bianca
aggiuntiva pari ai pixel mancanti per raggiungere l'altezza di 480px?
>>
>> grazie!
>
> Parliamo di VB.NET, giusto ? (sono un po' arruginito, non ricordo se in VB6
c'era una funzione DrawImage()... )
>
> se parliamo di .NET, allora, assumendo che "Immagine1.png" sia più piccola di
648*480, questo la inserisce al centro di una cornice bianca (e di conseguenza,
se è 640*Y crea solo le bande sopra e sotto):
>
> Dim sourceBMP As New Drawing.Bitmap("C:\Immagine1.png")
> Dim destBMP As New Drawing.Bitmap(640, 480)
> Dim destGraph As Drawing.Graphics
> Dim destX As Int32
> Dim destY As Int32
>
> destGraph = Drawing.Graphics.FromImage(destBMP)
> destGraph.Clear(Drawing.Color.White)
> destX = Convert.ToInt32((640 - sourceBMP.Width) / 2)
> destY = Convert.ToInt32((480 - sourceBMP.Height) / 2)
> destGraph.DrawImage(sourceBMP, New Point(destX, destY))

Grazie LucaD per la risposta,

il codice utilizzato è il seguente:

Dim bm As Bitmap
Dim originalX As Integer
Dim originalY As Integer
Dim destinationX As Integer
Dim destinationY As Integer
Dim destinationFolder As String
Dim destinationFileName As String
bm = New Bitmap(percorsoImmagine)
originalX = bm.Width
originalY = bm.Height
destinationX = 640
destinationY = CInt((destinationX / originalX) * originalY)
Dim thumb As New Bitmap(destinationX, destinationY)
Dim g As Graphics = Graphics.FromImage(thumb)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(bm, New Rectangle(0, 0, destinationX, destinationY), New
Rectangle(0, 0, bm.Width, bm.Height), GraphicsUnit.Pixel)
g.Dispose()
destinationFolder = (destinazioneImmagine)
destinationFileName = "" &
System.IO.Path.GetFileNameWithoutExtension(percorsoImmagine)
thumb.Save(destinationFolder, System.Drawing.Imaging.ImageFormat.Jpeg)
bm.Dispose()
thumb.Dispose()
Return True

mentre stavo adattandoci il tuo codice, ho notato che forse la riga seguente
possa contenere l'adattamento alla misura 640x480cm ma non so se sostituirla nel
primo o secondo new rectangle

g.DrawImage(bm, New Rectangle(0, 0, destinationX, destinationY), New
Rectangle(0, 0, bm.Width, bm.Height), GraphicsUnit.Pixel)

come lo adatto?

inoltre perchè nel tuo codice imposti le dimensioni di output con

destX = Convert.ToInt32((640 - sourceBMP.Width) / 2)
destY = Convert.ToInt32((480 - sourceBMP.Height) / 2) ??
il valore ottenuto non è negativo o zero visto che le foto di origine hanno
dimensione minima di 640x480 ad un max di 4000*3000??


grazie ancora
Luca D 11 Feb 2015 20:52
On Wednesday, February 11, 2015 at 6:27:04 PM UTC+1, NickBi wrote:
>
> inoltre perchè nel tuo codice imposti le dimensioni di output con
>
> destX = Convert.ToInt32((640 - sourceBMP.Width) / 2)
> destY = Convert.ToInt32((480 - sourceBMP.Height) / 2) ??
> il valore ottenuto non è negativo o zero visto che le foto di origine hanno
> dimensione minima di 640x480 ad un max di 4000*3000??

Quel codice non imposta le dimensioni, imposta il punto di origine...

Dalla tua premessa mi pareva di aver capito che tu già avessi fatto la
riduzione dell'immagine a 640*<Y in proporzione> (come infatti vedo quello nel
tuo codice>, per cui quelle istruzioni non possono mai generare coordinate <0

Servono quindi solo a prendere la tua immagine già scalata e disegnarla al
centro di una bitmap fissa 640*480 con sfondo bianco... in questo modo, "riempi"
l'immagine bianca con la tua immagine, e tutto quello che non viene sovrapposto
va a formare il bordo che volevi.
Luca D 11 Feb 2015 20:53
On Wednesday, February 11, 2015 at 6:27:04 PM UTC+1, NickBi wrote:
>
> inoltre perchè nel tuo codice imposti le dimensioni di output con
>
> destX = Convert.ToInt32((640 - sourceBMP.Width) / 2)
> destY = Convert.ToInt32((480 - sourceBMP.Height) / 2) ??
> il valore ottenuto non è negativo o zero visto che le foto di origine hanno
> dimensione minima di 640x480 ad un max di 4000*3000??

Quel codice non imposta le dimensioni, imposta il punto di origine...

Dalla tua premessa mi pareva di aver capito che tu già avessi fatto la
riduzione dell'immagine a 640*<Y in proporzione> (come infatti vedo quello nel
tuo codice), per cui quelle istruzioni non possono mai generare coordinate
negative

Servono quindi solo a prendere la tua immagine già scalata e disegnarla al
centro di una bitmap fissa 640*480 con sfondo bianco... in questo modo, "riempi"
l'immagine bianca con la tua immagine, e tutto quello che non viene sovrapposto
va a formare il bordo che volevi.
NickBi 12 Feb 2015 08:50
ok tutto chiaro,
avevo capito che sourceBMP.width fosse riferito alla dimensione del ******* di
origine in HD e quindi non mi ritrovavo con i calcoli.
appena ho tempo per adattarlo ti faccio sapere come va.

grazie ancora!!

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio Visual Basic di Microsoft | Tutti i gruppi | it.comp.lang.visual-basic | Notizie e discussioni visual basic | Visual basic Mobile | Servizio di consultazione news.