当前位置: 代码迷 >> PB >> pb从剪切板保存图片到文件的有关问题
  详细解决方案

pb从剪切板保存图片到文件的有关问题

热度:129   发布时间:2016-04-29 05:32:31.0
pb从剪切板保存图片到文件的问题
从网上看到的这段代码,从剪切板,把文件保存到图片,现在遇到以下几个问题:
1、保存路径没有用,如程序中,设定路径为: ls_path = "d:\1.bmp",而实际保存时,会在当前程序根目录中,出现一个文件名为:d 的文件
2、保存出来的文件无法用任何图片处理软件打开
3、查询了函数:GetDIBits,资料里说,他的最后一个参数只能是 :
DIB_PAL_COLORS:颜色表由指向当前逻辑调色板的16位索引值数组构成。
或者
DIB_RGB_COLORS:颜色表由红、绿、蓝(RGB)三个直接值构成。
而这两个常量,在我的pb代码里,就是一个变量,因为我不知道他们的值是多少,据说DIB_RGB_COLORS也可以设置为0来使用。

不知道是那里问题,这个从剪切板到文件的保存功能,保存出来的文件,无法使用。请高手指点,我已经查看了CSDN中的一些相关的帖子了,也下载了newease的两个例子,但都不是直接从剪切板保存到文件。

或者能有第三方现成的从剪切板到JPG图片,BMP图片的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
//messagebox('',lstr_Info.bmiHeader.biwidth)
//messagebox('',lstr_Info.bmiHeader.biheight)
//messagebox('',lstr_Info.bmiHeader.biSizeImage)
lblb_bitmap = Blob(Space(lstr_Info.bmiHeader.biSizeImage))    
//lblb_bitmap = Blob(Space(lstr_Info.bmiHeader.biwidth*lstr_Info.bmiHeader.biheight))    
//setnull(lblb_bitmap)
//messagebox(String(lstr_Info.bmiHeader.biSizeImage),len(lblb_bitmap))
//messagebox(String(lstr_Info.bmiHeader.biSizeImage),len(lblb_bitmap))
// 获取文件信息    
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)    
//lul_hBitmap由于已经通过selectobject函数选入上下文设备lul_hdcmem中,因此不需要再调用DeleteObject函数来删除
//DeleteObject(lul_hBitmap)
    
//(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  
  ls_path = "d:\1.bmp"

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)    
  相关解决方案