PB从剪贴板取图并保存

结构体定义

[cpp] 
  1. type bitmapinfoheader from structure  
  2.     long bisize    
  3.     long biwidth    
  4.     long biheight    
  5.     integer biplanes    
  6.     integer bibitcount    
  7.     long bicompression    
  8.     long bisizeimage    
  9.     long bixpelspermeter    
  10.     long biypelspermeter    
  11.     long biclrused    
  12.     long biclrimportant    
  13. end type  
  14.   
  15. type bitmapfileheader from structure  
  16.     integer bftype    
  17.     long bfsize    
  18.     integer bfreserved1    
  19.     integer bfreserved2    
  20.     long bfoffbits    
  21. end type  
  22.   
  23. type bitmapinfo from structure  
  24.     bitmapinfoheader bmiheader    
  25.     unsignedlong bmicolors[]    
  26. end type  


API定义

[cpp]
  1. FUNCTION Boolean OpenClipboard(ULong hWndNewOwner) LIBRARY "user32.dll"    
  2. FUNCTION Boolean CloseClipboard() LIBRARY "user32.dll"    
  3. FUNCTION ULong GetClipboardData(ulong wFormat) LIBRARY "user32.dll"    
  4. FUNCTION ulong IsClipboardFormatAvailable(ulong wFormat) LIBRARY "user32.dll"    
  5. FUNCTION ULong GetDesktopWindow() LIBRARY "user32.dll"    
  6. FUNCTION ULong GetDC(ULong hWnd) LIBRARY "user32.dll"    
  7. FUNCTION ULong CreateCompatibleDC(ULong hdc) LIBRARY "gdi32.dll"    
  8. FUNCTION ULong SelectObject(ULong hdc,ULong hgdiobj) LIBRARY "gdi32.dll"    
  9. FUNCTION Int GetDIBits(ULong hdc,ULong hbmp,UInt uStartScan,UInt cScanLines,REF Blob lpvBits,REF bitmapinfo lpbi,UInt uUsage) LIBRARY "gdi32.dll"    
  10. FUNCTION Int GetDIBits(ULong hdc,ULong hbmp,UInt uStartScan,UInt cScanLines, ULong lpvBits, REF bitmapinfo lpbi, UInt uUsage) LIBRARY "gdi32.dll"    
  11. SUBROUTINE CopyBitmapFileHeader(REF Blob Destination, bitmapfileheader Source,Long Length) LIBRARY "kernel32.dll" ALIAS FOR "RtlMoveMemory"    
  12. SUBROUTINE CopyBitmapInfo(REF Blob Destination, bitmapinfo Source,Long Length) LIBRARY "kernel32.dll" ALIAS FOR "RtlMoveMemory"    
  13. FUNCTION Boolean DeleteDC(ULong hdc) LIBRARY "gdi32.dll"    
  14. FUNCTION Int ReleaseDC(ULong hWnd,ULong hdc) LIBRARY "user32.dll"    
  15. FUNCTION ULong CreateFile(String lpFileName, ULong dwDesiredAccess, ULong dwShareMode, ULong lpSecurityAttributes, ULong dwCreationDisposition, &    
  16. ULong dwFlagsAndAttributes, ULong hTemplateFile ) LIBRARY "kernel32.dll" ALIAS FOR "CreateFileA"    
  17. FUNCTION Boolean WriteFile(ULong hFile,Blob lpBuffer,ULong nNumberOfBytesToWrite,REF ULong lpNumberOfBytesWritten, &    
  18. ULong lpOverlapped) LIBRARY "kernel32.dll"    
  19. FUNCTION Boolean CloseHandle(ULong hObject) LIBRARY "kernel32.dll"   

函数调用

[cpp]
  1. long lul_hBitmap    
  2. ulong lul_hdcmem, hdc    
  3. //判断剪贴板中的数据是否是BMP数据    
  4. constant ulong CF_BITMAP = 2    
  5. constant ulong DIB_RGB_COLORS = 0  
  6. constant ulong BITMAPTYPE = 19778  
  7. if IsClipboardFormatAvailable(CF_BITMAP) <> 1 then return        
  8. //(1)开始从剪贴板取数据    
  9. OpenClipboard(GetDesktopWindow())    
  10. lul_hBitmap = GetClipBoardData(CF_BITMAP)    
  11. CloseClipboard()    
  12. blob lb    
  13. hdc = GetDC(GetDesktopWindow())    
  14. lul_hdcmem = CreateCompatibleDC(hdc)    
  15. selectobject(lul_hdcmem, lul_hBitmap)    
  16. //(2)将取得的内存图片转换位blob数据流    
  17. ULong lul_hdc, lul_pixels    
  18. Blob lblb_header, lblb_info, lblb_bitmap    
  19. BitmapInfo lstr_Info    
  20. BitmapFileHeader lstr_Header    
  21. IF lul_hBitmap = 0 THEN return   
  22. lstr_Info.bmiHeader.biSize = 40    
  23. IF GetDIBits(lul_hdcMem, lul_hBitmap, 0, 0, 0, lstr_Info, DIB_RGB_COLORS) <= 0 THEN return    
  24. lul_pixels = lstr_Info.bmiHeader.biBitCount    
  25. lstr_Info.bmiColors[lul_pixels] = 0    
  26. lblb_bitmap = Blob(Space(lstr_Info.bmiHeader.biSizeImage))    
  27. // 获取文件信息    
  28. GetDIBits(lul_hdcMem, lul_hBitmap, 0, lstr_Info.bmiHeader.biheight, &    
  29. lblb_bitmap, lstr_Info, DIB_RGB_COLORS)    
  30. // 创建BMP文件头    
  31. lstr_Header.bfType = BITMAPTYPE    
  32. lstr_Header.bfSize = lstr_Info.bmiHeader.biSizeImage    
  33. lstr_Header.bfOffBits = 54 + (lul_pixels * 4)    
  34. // 将文件头转换成blob    
  35. lblb_header = Blob(Space(14))    
  36. CopyBitmapFileHeader(lblb_header, lstr_Header, 14)    
  37. // 将文件内容转换为blob    
  38. lblb_info = Blob(Space(40 + lul_pixels * 4))    
  39. CopyBitmapInfo(lblb_info, lstr_Info, 40 + lul_pixels * 4)    
  40. // 整合文件信息    
  41. lblb_bitmap = lblb_header + lblb_info + lblb_bitmap    
  42. //释放通过GetDC或GetWindowDC所检索出来的公用上下文设备    
  43. ReleaseDC(GetDesktopWindow(),hdc)    
  44. //删除通过CreteDC或CreateCompatibleDC所创建的上下文设备    
  45. DeleteDC(lul_hdcmem)    
  46.     
  47. //(3)取到图片文件后,则开始保存到文件中    
  48. if len(lblb_bitmap) <= 0 then  return  
  49. CONSTANT ULong INVALID_HANDLE_VALUE = -1    
  50. CONSTANT ULong GENERIC_WRITE = 1073741824    
  51. CONSTANT ULong FILE_SHARE_WRITE = 2    
  52. CONSTANT ULong CREATE_ALWAYS = 2    
  53. ULong lul_file, lul_length, lul_written    
  54. Boolean lb_rtn    
  55. // (创建)打开文件    
  56.   
  57. string ls_path, ls_file  
  58. int li_rc  
  59. li_rc = GetFileSaveName ( "Select BMP File",  ls_path, ls_file, "bmp",  "bmp Files (*.bmp),*.bmp" , "D:\",  32770)  
  60.   
  61. IF li_rc <> 1 Then RETURN  
  62.   
  63. lul_file = CreateFile(ls_path, GENERIC_WRITE, &    
  64. FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0)    
  65. IF lul_file = INVALID_HANDLE_VALUE THEN  RETURN    
  66. // 写文件    
  67. lul_length = Len(lblb_bitmap)    
  68. lb_rtn = WriteFile(lul_file, lblb_bitmap, &    
  69. lul_length, lul_written, 0)    
  70. // 关闭文件    
  71. CloseHandle(lul_file)       

需要保持为jpg格式文件的,可以在将图片保存为bmp格式后,再调用外部dll将bmp转为紧jpg。相关dll可以到这里下载 pb最好用的bmp图片转jpg图片dll(ImageUtils.dll)

    

相关源码:

PB从剪贴板取图并保存  

你可能感兴趣的:(pb)