Peter, if your question is still active, there is the solution (requires headers from 15 Nov 2010):
$include "olectl.inc"
$include "shlwapi.inc"
' line 113: update the path to your image, after "incbin"
declare GetImageDataSize_1(),int
declare asm_imageData_1
IStream stream
pointer imageData = &asm_imageData_1
int imagesize = GetImageDataSize_1()
UINT hImage
LARGE_INTEGER g_liZero ' zeroed
' pick step 1 or 2 by defining (or not) USE_SHCREATEMEMSTREAM condition
$define USE_SHCREATEMEMSTREAM
'---------------------------------------------------------------
' 1. using SHCreateMemStream api from shlwapi.dll (ordinal 12) Requires Windows XP.
$ifdef USE_SHCREATEMEMSTREAM
stream = SHCreateMemStream(imageData, imagesize)
if (!stream)
' ERROR: SHCreateMemStream failed
else
stream->_Seek(g_liZero, STREAM_SEEK_SET, NULL)
'
' OK, stream is now initialized, we can pass it to OleLoadPicture or GdipLoadImageFromStream
'
'TODO: call LoadImageFromStream here
if (!LoadImageFromStream(stream, imagesize, hImage))
MESSAGEBOX 0, "LoadImageFromStream failed", "Error"
else
MESSAGEBOX 0, "Image has been loaded", "Error"
DELETEIMAGE hImage, @IMGSCALABLE
endif
stream->Release()
endif
$else
'---------------------------------------------------------------
' 2. using standard stream - CreateStreamOnHGlobal
if (!CreateStreamOnHGlobal(0, TRUE, &stream))
if (stream->_Write(imageData, imagesize, NULL) < 0)
' ERROR
else
stream->_Seek(g_liZero, STREAM_SEEK_SET, NULL)
'
' OK, stream is now initialized, we can pass it to OleLoadPicture or GdipLoadImageFromStream
'
'TODO: call LoadImageFromStream here
if (!LoadImageFromStream(stream, imagesize, hImage))
MESSAGEBOX 0, "LoadImageFromStream failed", "Error"
else
MESSAGEBOX 0, "Image has been loaded", "Error"
DELETEIMAGE hImage, @IMGSCALABLE
endif
endif
stream->Release()
endif
$endif
'---------------------------------------------------------------
' The function to load image from stream, and convert to a scalable image.
' For JPG/WMF/ICO/GIF/CUR/BMP images we can do it with OLE functions
sub LoadImageFromStream(IStream stream, int imagesize, UINT hImage byref),BOOL
HRESULT hr = OleLoadPicture(stream, imagesize, FALSE, _IID_IPicture, &hImage)
/* if (hr < 0)
ERROR: unable to load image. Bad image format?
else
image loaded/created. Use @IMGSCALABLE in SHOWIMAGE
DELETEIMAGE hImage, @IMGSCALABLE
endif*/
return hr>=0
endsub
' for BitmapToRegion function
sub GetBitmapFromScalableImage(UINT hImage, UINT hBitmap byref),BOOL
IPicture pic = hImage
return (pic and !pic->get_Handle(&hBitmap))
endsub
' optional, not used here
sub GetScalableImageSize(UINT hImage, int width byref, int height byref),BOOL
UINT hBitmap
BITMAP bmp
if (GetBitmapFromScalableImage(hImage, hBitmap))
GetObject(hBitmap, len(bmp), &bmp)
width = bmp.bmWidth
height = bmp.bmHeight
return TRUE
endif
return FALSE
endsub
end
_asm
segment .data
asm_imageData_1:
incbin "D:\Aurora\projects\OCR\images\old\antifakepic18.jpg"
asm_imageDataEnd_1:
segment .text
GetImageDataSize_1:
mov eax,asm_imageDataEnd_1 - asm_imageData_1
ret
_endasm