以下是引用easyppt在2021-12-24 08:39:10的发言:
谢谢 吹版,只能处理BMP类型图片吗,其他类型的可以吗
我也一直想知道,VFP数据导入EXCEL时,怎么把图片也直接导入(不通过保存文件,而是数据流直接过去)
可以,剪贴板的CF_BITMAP是位图格式,要转换成位图数据。

程序代码:
** Excel显示数据流的图片
picFile = GETPICT("bmp,jpg,png")
IF !FILE(picFile)
RETURN
ENDIF
DECLARE long GlobalAlloc IN Kernel32 long,long
DECLARE long GlobalLock IN Kernel32 long
DECLARE long GlobalUnlock IN Kernel32 long
DECLARE long GlobalFree IN Kernel32 long
DECLARE long CreateStreamOnHGlobal IN ole32 long,long,long@
DECLARE long GdiplusStartup IN gdiplus long@,string@,long
DECLARE long GdiplusShutdown IN gdiplus long
DECLARE long GdipLoadImageFromStream IN gdiplus long,long@
DECLARE long GdipDisposeImage IN gdiplus long
DECLARE long GdipGetImageDimension IN gdiplus long,single@,single@
DECLARE long GdipSaveImageToStream IN gdiplus long,long,string@,long
DECLARE long GetDC IN user32 long
DECLARE long ReleaseDC IN user32 long, long
DECLARE long CreateCompatibleBitmap IN gdi32 long,long,long
DECLARE long SetDIBits IN gdi32 long,long,long,long,long,long,long
DECLARE long DeleteObject IN gdi32 long
DECLARE long OpenClipboard IN user32 long
DECLARE long EmptyClipboard IN user32
DECLARE long CloseClipboard IN user32
DECLARE long SetClipboardData IN user32 long,long
stGSI = 0h01000000000000000000000000000000
lpGDI = 0
GdiplusStartup(@lpGDI,@stGSI,0)
picStr = FILETOSTR(picFile)
nSize = LEN(picStr)
hMem = GlobalAlloc(0x42, nSize)
pMem = GlobalLock(hMem)
pStream = 0
CreateStreamOnHGlobal(hMem, 0, @pStream) && 创建流对象
SYS(2600, pMem, nSize, picStr) && 数据流
GlobalUnlock(hMem)
pImage = 0
GdipLoadImageFromStream(pStream, @pImage) && 根据数据流创建图片对象
nWidth = 0
nHeight = 0
GdipGetImageDimension(pImage, @nWidth, @nHeight)
hBitMem = GlobalAlloc(0x42, 54+nWidth*nHeight*4)
pBitMem = GlobalLock(hBitMem)
pBitStream = 0
CreateStreamOnHGlobal(hBitMem, 0, @pBitStream)
CLSID_BMP = 0h00F47C55041AD3119A730000F81EF32E
GdipSaveImageToStream(pImage, pBitStream, CLSID_BMP, 0)
GlobalUnlock(hBitMem)
nOffBits = CTOBIN(SYS(2600,pBitMem+10,4),"4RS")
nWidth = CTOBIN(SYS(2600,pBitMem+18,4),"4RS")
nHeight = CTOBIN(SYS(2600,pBitMem+22,4),"4RS")
hDC = GetDC(0)
hBitmap = CreateCompatibleBitmap(hDC, nWidth, nHeight)
SetDIBits(hDC, hBitmap, 0, nHeight, pBitMem+nOffBits, pBitMem+14, 0)
OpenClipboard(0)
EmptyClipboard()
SetClipboardData(2, hBitmap)
CloseClipboard()
DeleteObject(hBitmap)
ReleaseDC(0, hDC)
GlobalFree(hBitMem)
GdipDisposeImage(pImage)
GlobalFree(hMem)
GdiplusShutdown(lpGDI)
ec = CREATEOBJECT("Excel.Application")
ec.DisplayAlerts = 0
ec.WorkBooks.add
ec.ActiveSheet.Paste
ec.Visible = 1
CLEAR ALL