Quantcast
Channel: VBForums - CodeBank - Visual Basic 6 and earlier
Viewing all articles
Browse latest Browse all 1460

[VB6] Convert a picture to PNG byte-array in memory

$
0
0
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).

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

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>

Viewing all articles
Browse latest Browse all 1460

Trending Articles