And now I've found it again...OK, for this example you'll need a form with a picture box and a couple of a command buttons. The code assumes that the picturebox has a picture in it.
[tt]
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (lpString As Any) As Long
Private Declare Function IsBadStringPtrByLong Lib "kernel32" Alias "IsBadStringPtrW" (ByVal lpsz As Long, ByVal ucchMax As Long) As Long
' Lists the codecs we have available
Private Sub Command1_Click()
Dim GpInput As GdiplusStartupInput
Dim Token As Long
Dim Encoders As EncoderParameters
Dim lEncoders As Long
Dim lEncodersBuffer As Long
Dim arrEncoders() As ImageCodecInfo
Dim lp As Long
' Load the GDI+ Dll
GpInput.GdiplusVersion = 1
If GdiplusStartup(Token, GpInput) <> Ok Then
MsgBox "Error loading GDI+!", vbCritical
Else
GdipGetImageEncodersSize lEncoders, lEncodersBuffer
ReDim arrEncoders(lEncoders - 1) As ImageCodecInfo
GdipGetImageEncoders lEncoders, lEncodersBuffer, arrEncoders(0)
GdiplusShutdown Token
For lp = LBound(arrEncoders) To UBound(arrEncoders)
Debug.Print StringFromPointer(arrEncoders(lp).MimeTypePtr)
Next
End If
End Sub
Private Sub Command2_Click()
Dim GpInput As GdiplusStartupInput
Dim Token As Long
Dim myCLSID As CLSID
Dim myEncoderParameters As EncoderParameters
Dim myEncoder(0) As EncoderParameter
Dim gdiImage As Long
Dim Quality As Long
' Get and check we have a CLSID for a jpeg codec
If GetEncoderCLSID("image/jpeg", myCLSID) Then
GpInput.GdiplusVersion = 1
If GdiplusStartup(Token, GpInput) <> Ok Then
MsgBox "Error loading GDI+!", vbCritical
Else
myEncoderParameters.Count = 1
myEncoder(0).Guid = CLSIDFromString(EncoderQuality)
myEncoder(0).Type = EncoderParameterValueTypeLong
myEncoder(0).NumberOfValues = 1
Quality = 25 ' 0 to 100%
myEncoder(0).ValuePtr = VarPtr(Quality)
myEncoderParameters.Parameter = myEncoder(0)
GdipCreateBitmapFromHBITMAP Picture1.Picture.Handle, Picture1.Picture.hPal, gdiImage
Debug.Print GdipSaveImageToFile(gdiImage, "c:\test.jpg", myCLSID, myEncoderParameters)
GdiplusShutdown Token
End If
End If
End Sub
' helper function to get CLSID of output codec
Private Function GetEncoderCLSID(ByVal strMimeType As String, outCLSID As CLSID) As Long
Dim GpInput As GdiplusStartupInput
Dim Token As Long
Dim lEncoders As Long
Dim lEncodersBuffer As Long
Dim lp As Long
Dim arrEncoders() As ImageCodecInfo
GpInput.GdiplusVersion = 1
If GdiplusStartup(Token, GpInput) <> Ok Then
MsgBox "Error loading GDI+!", vbCritical
Else
GdipGetImageEncodersSize lEncoders, lEncodersBuffer
ReDim arrEncoders(lEncoders - 1) As ImageCodecInfo
GdipGetImageEncoders lEncoders, lEncodersBuffer, arrEncoders(0)
GdiplusShutdown Token
GetEncoderCLSID = False
For lp = LBound(arrEncoders) To UBound(arrEncoders)
If StringFromPointer(arrEncoders(lp).MimeTypePtr) = strMimeType Then
outCLSID = arrEncoders(lp).CLSID
GetEncoderCLSID = True
Exit For
End If
Next
End If
End Function
' Works for strings that are nullchar terminated
Public Function StringFromPointer(lpString As Long) As String
Dim sRet As String
Dim lret As Long
Dim lMaxLength As Long
Dim lCodec
If lpString = 0 Then
StringFromPointer = ""
Exit Function
End If
lMaxLength = lstrlen(ByVal lpString) * 2
If IsBadStringPtrByLong(lpString, lMaxLength) Then
StringFromPointer = ""
Exit Function
End If
sRet = Space$(lMaxLength)
CopyMemory ByVal sRet, ByVal lpString, Len(sRet)
StringFromPointer = StrConv(sRet, vbFromUnicode) 'sRet
End Function