结构体定义
type bitmapinfoheader from structure long bisize long biwidth long biheight integer biplanes integer bibitcount long bicompression long bisizeimage long bixpelspermeter long biypelspermeter long biclrused long biclrimportant end type type bitmapfileheader from structure integer bftype long bfsize integer bfreserved1 integer bfreserved2 long bfoffbits end type type bitmapinfo from structure bitmapinfoheader bmiheader unsignedlong bmicolors[] end type
API定义
FUNCTION Boolean OpenClipboard(ULong hWndNewOwner) LIBRARY "user32.dll" FUNCTION Boolean CloseClipboard() LIBRARY "user32.dll" FUNCTION ULong GetClipboardData(ulong wFormat) LIBRARY "user32.dll" FUNCTION ulong IsClipboardFormatAvailable(ulong wFormat) LIBRARY "user32.dll" FUNCTION ULong GetDesktopWindow() LIBRARY "user32.dll" FUNCTION ULong GetDC(ULong hWnd) LIBRARY "user32.dll" FUNCTION ULong CreateCompatibleDC(ULong hdc) LIBRARY "gdi32.dll" FUNCTION ULong SelectObject(ULong hdc,ULong hgdiobj) LIBRARY "gdi32.dll" FUNCTION Int GetDIBits(ULong hdc,ULong hbmp,UInt uStartScan,UInt cScanLines,REF Blob lpvBits,REF bitmapinfo lpbi,UInt uUsage) LIBRARY "gdi32.dll" FUNCTION Int GetDIBits(ULong hdc,ULong hbmp,UInt uStartScan,UInt cScanLines, ULong lpvBits, REF bitmapinfo lpbi, UInt uUsage) LIBRARY "gdi32.dll" SUBROUTINE CopyBitmapFileHeader(REF Blob Destination, bitmapfileheader Source,Long Length) LIBRARY "kernel32.dll" ALIAS FOR "RtlMoveMemory" SUBROUTINE CopyBitmapInfo(REF Blob Destination, bitmapinfo Source,Long Length) LIBRARY "kernel32.dll" ALIAS FOR "RtlMoveMemory" FUNCTION Boolean DeleteDC(ULong hdc) LIBRARY "gdi32.dll" FUNCTION Int ReleaseDC(ULong hWnd,ULong hdc) LIBRARY "user32.dll" FUNCTION ULong CreateFile(String lpFileName, ULong dwDesiredAccess, ULong dwShareMode, ULong lpSecurityAttributes, ULong dwCreationDisposition, & ULong dwFlagsAndAttributes, ULong hTemplateFile ) LIBRARY "kernel32.dll" ALIAS FOR "CreateFileA" FUNCTION Boolean WriteFile(ULong hFile,Blob lpBuffer,ULong nNumberOfBytesToWrite,REF ULong lpNumberOfBytesWritten, & ULong lpOverlapped) LIBRARY "kernel32.dll" FUNCTION Boolean CloseHandle(ULong hObject) LIBRARY "kernel32.dll"
函数调用
long lul_hBitmap ulong lul_hdcmem, hdc //判断剪贴板中的数据是否是BMP数据 constant ulong CF_BITMAP = 2 constant ulong DIB_RGB_COLORS = 0 constant ulong BITMAPTYPE = 19778 if IsClipboardFormatAvailable(CF_BITMAP) <> 1 then return //(1)开始从剪贴板取数据 OpenClipboard(GetDesktopWindow()) lul_hBitmap = GetClipBoardData(CF_BITMAP) CloseClipboard() blob lb hdc = GetDC(GetDesktopWindow()) lul_hdcmem = CreateCompatibleDC(hdc) selectobject(lul_hdcmem, lul_hBitmap) //(2)将取得的内存图片转换位blob数据流 ULong lul_hdc, lul_pixels Blob lblb_header, lblb_info, lblb_bitmap BitmapInfo lstr_Info BitmapFileHeader lstr_Header IF lul_hBitmap = 0 THEN return lstr_Info.bmiHeader.biSize = 40 IF GetDIBits(lul_hdcMem, lul_hBitmap, 0, 0, 0, lstr_Info, DIB_RGB_COLORS) <= 0 THEN return lul_pixels = lstr_Info.bmiHeader.biBitCount lstr_Info.bmiColors[lul_pixels] = 0 lblb_bitmap = Blob(Space(lstr_Info.bmiHeader.biSizeImage)) // 获取文件信息 GetDIBits(lul_hdcMem, lul_hBitmap, 0, lstr_Info.bmiHeader.biheight, & lblb_bitmap, lstr_Info, DIB_RGB_COLORS) // 创建BMP文件头 lstr_Header.bfType = BITMAPTYPE lstr_Header.bfSize = lstr_Info.bmiHeader.biSizeImage lstr_Header.bfOffBits = 54 + (lul_pixels * 4) // 将文件头转换成blob lblb_header = Blob(Space(14)) CopyBitmapFileHeader(lblb_header, lstr_Header, 14) // 将文件内容转换为blob lblb_info = Blob(Space(40 + lul_pixels * 4)) CopyBitmapInfo(lblb_info, lstr_Info, 40 + lul_pixels * 4) // 整合文件信息 lblb_bitmap = lblb_header + lblb_info + lblb_bitmap //释放通过GetDC或GetWindowDC所检索出来的公用上下文设备 ReleaseDC(GetDesktopWindow(),hdc) //删除通过CreteDC或CreateCompatibleDC所创建的上下文设备 DeleteDC(lul_hdcmem) //(3)取到图片文件后,则开始保存到文件中 if len(lblb_bitmap) <= 0 then return CONSTANT ULong INVALID_HANDLE_VALUE = -1 CONSTANT ULong GENERIC_WRITE = 1073741824 CONSTANT ULong FILE_SHARE_WRITE = 2 CONSTANT ULong CREATE_ALWAYS = 2 ULong lul_file, lul_length, lul_written Boolean lb_rtn // (创建)打开文件 string ls_path, ls_file int li_rc li_rc = GetFileSaveName ( "Select BMP File", ls_path, ls_file, "bmp", "bmp Files (*.bmp),*.bmp" , "D:\", 32770) IF li_rc <> 1 Then RETURN lul_file = CreateFile(ls_path, GENERIC_WRITE, & FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0) IF lul_file = INVALID_HANDLE_VALUE THEN RETURN // 写文件 lul_length = Len(lblb_bitmap) lb_rtn = WriteFile(lul_file, lblb_bitmap, & lul_length, lul_written, 0) // 关闭文件 CloseHandle(lul_file)
需要保持为jpg格式文件的,可以在将图片保存为bmp格式后,再调用外部dll将bmp转为紧jpg。相关dll可以到这里下载 pb最好用的bmp图片转jpg图片dll(ImageUtils.dll)
PB从剪贴板取图并保存