从网上看到的这段代码,从剪切板,把文件保存到图片,现在遇到以下几个问题:
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)