In case you want to compare my code that works, here is what I used:
Private Function pvGetEncoderClsID(strMimeType As String, ClassID() As Long) As Long
Dim Num As Long
Dim Size As Long
Dim lIdx As Long
Dim ICI() As ImageCodecInfo
Dim Buffer() As Byte
pvGetEncoderClsID = -1 ' Failure flag
Call GdipGetImageEncodersSize(Num, Size)
If (Size = 0&) Then Exit Function ' Failed!
ReDim ICI(1 To Num) As ImageCodecInfo
ReDim Buffer(1 To Size) As Byte
Call GdipGetImageEncoders(Num, Size, Buffer(1))
Call CopyMemory(ICI(1), Buffer(1), (Len(ICI(1)) * Num))
For lIdx = 1& To Num
If (StrComp(pvPtrToStrW(ICI(lIdx).MimeType), strMimeType, vbTextCompare) = 0) Then
CopyMemory ClassID(0), ICI(lIdx).ClassID(0), 16& ' Save the Class ID
pvGetEncoderClsID = lIdx ' Return the index number for success
Exit For
End If
Next lIdx
Erase ICI
Erase Buffer
End Function
Private Function pvPtrToStrW(ByVal lpsz As Long) As String
String Pointer to String
Dim sOut As String
Dim lLen As Long
lLen = lstrlenW(lpsz)
If (lLen > 0&) Then
sOut = StrConv(String$(lLen, vbNullChar), vbUnicode)
Call CopyMemory(ByVal sOut, ByVal lpsz, lLen * 2&)
pvPtrToStrW = StrConv(sOut, vbFromUnicode)
End If
End Function
Public Function ConvertToPng(FileName As String) As String
Dim hStatus As Long
Dim token As Long
Dim StartupInput As GdiplusStartupInput
Dim EncoderClsid As String
Dim pImage As Long
Dim nWidth As Long
Dim nHeight As Long
Dim transformation As Long
Dim strFileName As String
Dim ClassID() As Long
ReDim ClassID(0 To 3) As Long
StartupInput.GdiplusVersion = 1
hStatus = GdiplusStartup(token, StartupInput)
If hStatus Then
PutToLog 0, "Error initializing GDI+", ""
Exit Function
End If
hStatus = GdipLoadImageFromFile(StrPtr(FileName), pImage)
EncoderClsid = pvGetEncoderClsID("image/png", ClassID)
strFileName = GetPath(FileName) & GetFileNameWithoutExtention(FileName) & ".png"
hStatus = GdipSaveImageToFile(pImage, StrPtr(strFileName), ClassID(0&), 0)
If hStatus = 0 Then
Else
PutToLog 0, "Error:", CStr(hStatus) & " ---- " & CStr(Err.LastDllError)
End If
If pImage Then GdipDisposeImage (pImage)
ConvertToPng = strFileName
GdiplusShutdown token
End Function