注册 登录
编程论坛 VFP论坛

GdipSaveImageToFile使用求解,希望能将剪贴板的内容另存为图片D:\test.jpg

shschy 发布于 2022-03-27 11:17, 1760 次点击
GdipSaveImageToFile使用求解,希望能将剪贴板的内容另存为图片D:\test.jpg
4 回复
#2
shschy2022-03-27 11:30
感谢sych的帮助,前面他发了代码,win10+VFP9环境测试成功
DECLARE INTEGER GetClipboardData IN win32api INTEGER
DECLARE INTEGER OpenClipboard IN win32api INTEGER
DECLARE INTEGER CloseClipboard IN win32api
DECLARE LONG IsClipboardFormatAvailable IN user32 LONG
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
Declare Long GdiplusShutdown in GdiPlus  Long token
Declare Long GdiplusStartup in GdiPlus  Long @ token, String @ input, Long @ output
DECLARE INTEGER GdipCreateBitmapFromHBITMAP in GdiPlus.dll INTEGER, INTEGER, INTEGER @
DECLARE INTEGER GdipSaveImageToFile in GdiPlus.dll INTEGER,String,String @,String @
DECLARE LONG GdipDisposeImage IN GDIPLUS LONG nImage
IF IsClipboardFormatAvailable(2)=0
    MESSAGEBOX("剪贴板中没有图像",64,"温馨提示")
else
    IF OpenClipboard(0)=0
        MESSAGEBOX("剪贴板打开失败",64,"温馨提示")
    else
        lcOutputFile="D:\test.jpg"
        hBitmap = GetClipboardData(2)  &&CF_BITMAP=2
        hToken=0
        cInput = PADR(CHR(1), 16, CHR(0))
        GdiplusStartup(@hToken, @cInput, 0)
        ubitmap=0
        GdipCreateBitmapFromHBITMAP(hBitmap,2,@ubitmap)
        qEncoderClsID_BMP=0h00F47C55041AD3119A730000F81EF32E
        GdipSaveImageToFile(ubitmap,STRCONV(lcOutputFile+CHR(0),5),qEncoderClsID_BMP,null)
        GdipDisposeImage(ubitmap)
        GdiplusShutdown(m.hToken)
        closehandle(hBitmap)
        CloseClipboard()
    endif
endif
#3
sam_jiang2022-12-12 10:24
*!*    VFP 图形文件与剪切板互换的API解决方法

*!*    在 VFP 中,凡遇图形处理,大多数情况下,都会涉及到图形文件与剪切板互换的情况。下面给出利用 API 解决的方法。这是原来从网上摘下来的,版权归原作者。
*!*    基本处理的代码如下,你可以将其应用到你的代码中。

DECLARE INTEGER OpenClipboard               IN User32 INTEGER
DECLARE INTEGER CloseClipboard              IN User32
DECLARE INTEGER EmptyClipboard              IN User32
DECLARE INTEGER SetClipboardData            IN User32 INTEGER,INTEGER
DECLARE INTEGER LoadImage                   IN WIN32API INTEGER,String,INTEGER,INTEGER,INTEGER,INTEGER
DECLARE INTEGER GetClipboardData            IN User32 INTEGER
DECLARE INTEGER GdipCreateBitmapFromHBITMAP IN GdiPlus.dll INTEGER, INTEGER, INTEGER @
DECLARE INTEGER GdipSaveImageToFile         IN GdiPlus.dll INTEGER,String,String @,String @
DECLARE Long    GdipCreateHBITMAPFromBitmap IN GDIPLUS.DLL Long nativeImage, Long @, Long
DECLARE Long    GdipCreateBitmapFromFile    IN GDIPLUS.DLL String FileName, Long @nBitmap
DECLARE Long    CopyImage                   IN WIN32API Long hImage, Long, Long, Long , Long

#Define CF_BITMAP 2
#Define CF_DIB 8
#Define IMAGE_BITMAP 0
#Define LR_LOADFROMFILE 16

*1.将图形文件保存到剪切板
nBitmap=0
hbm=0
imagefile='图形文件名'
GdipCreateBitmapFromFile(STRCONV(imagefile+0h00,5),@nBitmap)
GdipCreateHBITMAPFromBitmap(nBitmap,@hbm,0)
lhBmp = CopyImage(hbm, 0, 0, 0, 0)
IF OpenClipboard(0)!= 0
   EmptyClipboard()
   SetClipboardData(CF_BITMAP, lhBmp)
   CloseClipboard()
ENDIF

*2.将剪切板图形保存到本地
OpenClipboard(0)
hBitmap = GetClipboardData(CF_BITMAP)
hDib = GetClipboardData(CF_DIB)
CloseClipboard()
uBitmap=0
GdipCreateBitmapFromHBITMAP(hBitmap,2,@uBitmap)
lcOutputFile=STRCONV('C:\_Temp1.jpg'+CHR(0),5)
*!* lqEncoderClsID_BMP=0h00F47C55041AD3119A730000F81EF32E &&BMP格式
lqEncoderClsID_JPG=0h01F47C55041AD3119A730000F81EF32E &&JPG格式
*!* lqEncoderClsID_GIF=0h02F47C55041AD3119A730000F81EF32E &&GIF格式
*!* lqEncoderClsID_TIF=0h05F47C55041AD3119A730000F81EF32E &&TIF格式
*!* lqEncoderClsID_PNG=0h06F47C55041AD3119A730000F81EF32E &&PNG格式
GdipSaveImageToFile(uBitmap,lcOutputFile,lqEncoderClsID_JPG,NULL)

赠人玫瑰,手有余香!哈哈
#4
schtg2022-12-13 05:25
谢谢!
#5
pvm20002022-12-26 00:19
学习了
1