结构体定义
- 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)