Salvare immagini i formato JPG utilizzando GDI+

Molto spesso si ha la necessità, anche per motivi di spazio, di salvare le immagini in formato JPG. Questa procedura, senza l’utilizzo di dll aggiuntive, sfrutta le chiamate alle librerie GDI+, presenti nei sistemi XP o comunque di ultima generazione, per effettuare questa operazione.

In un modulo dichiariamo la seguente funzione:

 

Option Explicit
‘ Dichiarazioni API

Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type

Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type

Private Type EncoderParameter
GUID As GUID
NumberOfValues As Long
type As Long
Value As Long
End Type

Private Type EncoderParameters
Count As Long
Parameter As EncoderParameter
End Type

Private Declare Function GdiplusStartup Lib “GDIPlus” ( token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Function GdiplusShutdown Lib “GDIPlus” ( ByVal token As Long) As Long
Private Declare Function GdipCreateBitmapFromHBITMAP Lib “GDIPlus” ( ByVal hbm As Long, ByVal hpal As Long, Bitmap As Long) As Long
Private Declare Function GdipDisposeImage Lib “GDIPlus” ( ByVal Image As Long) As Long
Private Declare Function GdipSaveImageToFile Lib “GDIPlus” ( ByVal Image As Long, ByVal filename As Long, clsidEncoder As GUID, encoderParams As Any) As Long
Private Declare Function CLSIDFromString Lib “ole32″ ( ByVal str As Long, id As GUID) As Long
‘ Salva in JPG

Public Sub SaveJPG( ByVal pict As StdPicture, ByVal filename As String, Optional ByVal quality As Byte = 80)
Dim tSI As GdiplusStartupInput
Dim lRes As Long
Dim lGDIP As Long
Dim lBitmap As Long

‘ Inizializza GDI+
tSI.GdiplusVersion = 1
lRes = GdiplusStartup(lGDIP, tSI)

If lRes = 0 Then

‘ Crea la bitmap GDI+  dall’handle dell’immagine
lRes = GdipCreateBitmapFromHBITMAP(pict.Handle, 0, lBitmap)

If lRes = 0 Then
Dim tJpgEncoder As GUID
Dim tParams As EncoderParameters

‘ Inizializza la codifica GUID
CLSIDFromString StrPtr(“{557CF401-1A04-11D3-9A73-0000F81EF32E}”), tJpgEncoder

‘ Inizializza la codifica dei parametri
tParams.Count = 1
With tParams.Parameter ‘ Qualità
‘ Imposta la Qualità GUID
CLSIDFromString StrPtr(“{1D5BE4B5-FA4A-452D-9CDD-5DB3505E7EB}”), .GUID
.NumberOfValues = 1
.type = 1
.Value = VarPtr(quality)
End With

‘ Salva l’immagine
lRes = GdipSaveImageToFile( lBitmap, StrPtr(filename), tJpgEncoder, tParams)

‘ Elimina la bitmap
GdipDisposeImage lBitmap
End If
‘ Chiude il processo GDI+
GdiplusShutdown lGDIP

End If

If lRes Then
Err.Raise 5, , “Non posso salvare l’immagine. Errore GDI+:” & lRes
End If

End Sub

Per salvare infine l’immagine in formato JPG è sufficiente richiamare la seguente routine (dove Picture1 sarà il controllo picture nel quale è stata caricata l’immagine e può essere visibile o nascosto):

 

SaveJPG Picture1, “C:\Percorso\Nomefile.jpg”, 80

 

L’ultimo parametro è la qualità dell’immagine, da non confondersi con la compressione che non è parametrizzabile.

Questa procedura si ricorda è valida su sistemi con OS Windows XP o comunque che abbiano installate le liberie GDI+.

Both comments and pings are currently closed.

Comments are closed.