主题:OLE拖放和图像处理 以及 picturebox
singlion
[专家分:690] 发布于 2008-02-23 22:38:00
第一个问题:OLE拖放时,拖到程序中图片的话,用Data.GetData(vbCFDIB)得到的是什么,能否直接保存到文件?如果能,麻烦简单说一下,后边的问题就无所谓了。
第二个问题,接上一问题,如果不能保存到文件,那么能否显示到PictureBox里面?
第三个问题,接上一问题,如果能显示,又如何把PictureBox中的图像保存到文件?
为何下面的代码会出错?
If Data.GetFormat(vbCFBitmap) Or _
Data.GetFormat(vbCFMetafile) Or _
Data.GetFormat(vbCFDIB) Or _
Data.GetFormat(vbCFEMetafile) Then
Picture1.Picture = LoadPicture(Data.GetData(vbCFBitmap))
出错为:指定的格式与数据格式不匹配
把Data.GetData(vbCFBitmap)改为Data.GetData(vbCFDIB)则出错为:
文件未找到
改为其他数据格式出错均与vbCFBitmap相同
最后更新于:2008-02-23 22:55:00
回复列表 (共7个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2008-02-24 09:44:00
我只知道第三个问题,好像使用图片框的保存方法就可以。具体参数设计请查阅vb帮助。
板凳
一江秋水 [专家分:9680] 发布于 2008-02-24 12:52:00
在图片框的OLEDragOver过程中判断文件名后缀是否图片
Dim st As String
st = Right(UCase(Data.Files.Item(1)), 3) '获取文件后缀
If InStr("BMP,JPG,JPEG,GIF,ICO", st) Then
Effect = vbDropEffectCopy And Effect '显示带小加号的可以放下的图标
Else
Effect = vbDropEffectNone '否则显示圆圈加斜线不可放下的图标
End If
在OLEDragDrop过程中:
Dim OpenName As String
If Data.GetFormat(vbCFFiles) Then
OpenName = Data.Files.Item(1)
PictureBox1.Picture = LoadPicture(OpenName)
End If
3 楼
singlion [专家分:690] 发布于 2008-02-24 17:34:00
2楼的是拖动文件的代码吧?
我不是想拖动文件,我是把网页上的图片拖到程序中,也就是说,我是想弄“一拖即存”。
现在解决程度是这样的:
我已经查资料得知可以使用savepicture函数把picturebox中的图片保存到文件;
最后的代码出错原因也找到,是因为不必用loadpicture,而是应该直接用data.getdata(vbCFDIB);
关于savepicture函数保存到文件的文件格式,有这么两句说明:
无论在设计时还是运行时图形从文件加载到对象的 Picture 属性,而且它是位图、图标、元文件或增强元文件,则图形将以原始文件同样的格式保存。如果它是 GIF 或 JPEG 文件,则将保存为位图文件。
目前我想知道的是(虽然只要解决下面两个问题中的一个就能解决一拖即存的问题,但是我希望2个问题都能解决):
1.一开始的第一个问题,用Data.GetData(vbCFDIB)得到的是什么,能否直接保存到文件?
2.拖动到picturebox中的图片在保存时如何判断应该保存为何种扩展名的文件?
4 楼
singlion [专家分:690] 发布于 2008-02-24 20:05:00
又有进展。
经过试验发现,一个网页中的jpg图像拖动到picturebox中,用savepicture函数保存时,扩展名为jpg或bmp都能正常保存!
5 楼
一江秋水 [专家分:9680] 发布于 2008-02-24 20:21:00
第一个问题:
VbCFDIB 得到的是与设备无关的位图(.dib or .bmp)
直接保存的代码如下:
'Picture1.OLEDropMode属性设置为 1
Private Sub Picture1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
On Error Resume Next
Effect = vbDropEffectCopy
If Data.GetFormat(vbCFDIB) Then
Picture1.Picture = Data.GetData(vbCFDIB)
SavePicture Picture1.Picture, "D:\100.BMP"
End If
End Sub
第二个问题的答案我也想知道
6 楼
singlion [专家分:690] 发布于 2008-02-24 20:33:00
我用的就是你说的这个方法,在保存之前需要把图片加载到picturebox里面,所以我原先认为这样不是“直接保存”。
只不过我没有使用Effect参数,它的作用是什么?
7 楼
一江秋水 [专家分:9680] 发布于 2008-02-25 08:10:00
effect 源对象最初设置的长整型数,用来识别它支持的效果。在事件过程中,此参数必须被目标部件
正确地设置。effect 值由所有活动的效果(如设置值表)逻辑 Or 确定。目标部件应检查这
些效果以及其它参数以确定哪个动作适合于它,然后把此参数设置为允许的效果之一(如源所
规定),以便确定放置选项到部件该执行哪个动作。可能的取值列于“设置值”中。
effect 设置如下:
常数 值 描述
vbDropEffectNone 0 放目标不接受数据。
VbDropEffectCopy 1 放结果保存于从源到目标的数据拷贝中。初始数据没有被拖放操作改变。
VbDropEffectMove 2 放结果保存于要从拖放源移到放源的数据中。移动后,拖放源要删除数据。
vbDropEffectScroll -2147483648(&H80000000) 在目标部件中,滚动正在或将要发生。此值与其它值共同使用。注意:仅当在部件中执行自己的滚动时才能应用。
你不想把把图片加载到picturebox里面也行,那就要使用剪贴板,代码如下:
If Data.GetFormat(vbCFDIB) Then
Clipboard.SetData Data.GetData(vbCFDIB)
SavePicture Clipboard.GetData, "D:\100.BMP"
End If
我来回复