This WIA sample converts an StdPicture to a PNG byte-array without using any temporary disk storage.
Shows how to use IPicture.SaveAsFile method with plain ADODB.Stream (no CreateStreamOnHGlobal API used).
JFYI, the magic offset 68 is the difference between ObjPtr of IUnknown and IStream casts of an ADODB.Stream instance.
Using Picture property on WIA.Vector converts all StdPicture subtypes (like Enhanced Metafiles or Icons) to vbPicTypeBitmap because WIA's Convert filter fails on anything but a serialized vbPicTypeBitmap 32bbp image it seems.
cheers,
</wqw>
Shows how to use IPicture.SaveAsFile method with plain ADODB.Stream (no CreateStreamOnHGlobal API used).
Code:
Option Explicit
Private Sub Form_Load()
Debug.Print UBound(SaveAsPng(picTab1.Picture))
End Sub
Public Function SaveAsPng(pPic As IPicture) As Byte()
Const adTypeBinary As Long = 1
Const wiaFormatPNG As String = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
Dim oStream As Object ' ADODB.Stream
Dim oImageFile As Object ' WIA.ImageFile
'--- load pPic in WIA.ImageFile
Do While oImageFile Is Nothing
Set oStream = CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary
oStream.Open
Call pPic.SaveAsFile(ByVal ObjPtr(oStream) + 68, True, 0) '--- magic
If oStream.Size = 0 Then
GoTo QH
End If
oStream.Position = 0
With CreateObject("WIA.Vector")
.BinaryData = oStream.Read
If pPic.Type <> vbPicTypeBitmap Then
'--- this converts pPic to vbPicTypeBitmap subtype
Set pPic = .Picture
Else
Set oImageFile = .ImageFile
End If
End With
Loop
'--- serialize WIA.ImageFile to PNG file format
With CreateObject("WIA.ImageProcess")
.Filters.Add .FilterInfos("Convert").FilterID
.Filters(.Filters.Count).Properties("FormatID").Value = wiaFormatPNG
SaveAsPng = .Apply(oImageFile).FileData.BinaryData
End With
QH:
End Function
Using Picture property on WIA.Vector converts all StdPicture subtypes (like Enhanced Metafiles or Icons) to vbPicTypeBitmap because WIA's Convert filter fails on anything but a serialized vbPicTypeBitmap 32bbp image it seems.
cheers,
</wqw>