VB如何将图片框中某部分图片保存在stdPicture里面呢?

penguinhzf 2014-03-14 10:45:14
假设我现在有一个图片框,里面保存了一张1000*1000的图片,我现在用一个变量 Dim aa as StdPicture,想把图片框里面的图片的一个区域(LEFT:200,TOP:500,RIGHT:300,BOTTOM:550)直接保存到变量aa里面,以至于以后我直接通过另外一个图片框(picture2可以直接调用aa的图片内容,能做出来吗?请贴代码,感激不尽!
...全文
1931 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-03-17
  • 打赏
  • 举报
回复
PaintPicture 方法 用以在 Form, PictureBox 或 Printer 上绘制图形文件(.bmp、.wmf、.emf、.cur、.ico或 .dib)的内容。不支持命名参数。 语法 object.PaintPicture picture, x1, y1, width1, height1, x2, y2, width2, height2, opcode PaintPicture 方法的语法包含下列部分: 部分 描述 object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,带有焦点的 Form 对象缺省为 object。 Picture 必需的。要绘制到 object 上的图形源。Form 或 PictureBox 必须是 Picture 属性。 x1, y1 必需的。均为单精度值,指定在 object 上绘制 picture 的目标坐标(x-轴和y-轴)。object 的 ScaleMode 属性决定使用的度量单位。 Width1 可选的。单精度值,指示 picture 的目标宽度。object 的 ScaleMode 属性决定使用的度量单位。如果目标宽度比源宽度 (width2) 大或小,将适当地拉伸或压缩 picture。如果该参数省略,则使用源宽度。 Height1 可选的。 单精度值,指示 picture 的目标高度。object 的 ScaleMode 属性决定使用的度量单位。如果目标高度比源高度 (height2) 大或小,将适当地拉伸或压缩 picture。如果该参数省略,则使用源高度。 x2, y2 可选的。均为单精度值,指示 picture 内剪贴区的坐标(x-轴和y-轴)。object 的 ScaleMode 属性决定使用的度量单位。如果该参数省略,则缺省为 0。 Width2 可选的。单精度值,指示 picture 内剪贴区的源宽度。object 的 ScaleMode 属性决定使用的度量单位。如果该参数省略,则使用整个源宽度。 Height2 可选的。 单精度值,指示 picture 内剪贴区的源高度。object 的 ScaleMode 属性决定使用的度量单位。如果该参数省略,则使用整个源高度。 Opcode 可选的。是长型值或仅由位图使用的代码。它用来定义在将 pictur 绘制到 object 上时对 picture 执行的位操作(例如, vbMergeCopy 或 vbSrcAnd 操作符)。关于位操作符常数的完整列表,请参阅 Visual Basic Help 文件中的 RasterOp Constants 主题。 在使用opcode时有一些限制。例如,如果资源是图标或图元文件,则只能使用 vbSrcCopy,而不能使用其他的opcode;并且,与图案 (或 SDK 术语中的"画笔"),如 MERGECOPY、 PATCOPY、 PATPAINT 和 PATINVERT,相交互的opcode实际上是同目标的 FillStyle 属性交互。 注意 Opcode 用于将按位操作传递到位图。当传递其他图象类型时将一个值给该参数会造成“无效过程调用或参数”错误。这是设计的原因。要避免这个错误,对于除位图外的图象,将 Opcode 参数置为空。 说明 通过使用负的目标高度值 (height1) 和 / 或目标宽度值 (width1) ,可以水平或垂直翻转位图。 可以省略任何多个可选的尾部的参数 。如果省略了一个或多个可选尾部参数,则不能在指定的最后一个参数后面使用逗号。如果想指定某个可选参数,则必须先指定语法中出现在该参数前面的全部参数。 注意,在将一个.Bmp加载入 PictureBox 控件和使用 Windows API 函数 BitBlt() 添加图片之间有一点不同。当您对一个图象使用 BitBlt() 时,PictureBox 控件不知道象您使用 LoadPicture方法那样去调整大小。将 ScaleWidth 和 ScaleHeight 属性设置为图象的大小也不起作用。如果您想在使用 BitBlt 之后用 PictureBox 调整新图片的大小,必须用代码手工做,转换单位并处理边框,下面是如何这样做的一个简单示例: Sub ResizePictureBoxToImage(pic as PictureBox, twipWd _ as Integer, twipHt as Integer) ' 该代码假设所有的单位都为缇。如果 ' 不是,必须在调用该例程之前,转换为缇。 ' 这里也假设图象显示在0,0处。 Dim BorderHt as Integer, BorderWd as Integer BorderWd = Pic.Width - Pic.ScaleWidth BorderHt = Pic.Height - Pic.ScaleHeight pic.Move pic.Left, pic.Top, twipWd + BorderWd, _ twipHt + BorderHt End Sub
dianyancao 2014-03-17
  • 打赏
  • 举报
回复
你试试这个,已经将指定的位图数据保存到aa中了
  Dim aa As IPictureDisp
  
  Picture2.Width = 300 - 200 + 1 + 4 '因为图像框边框有宽度,所以要+4
  Picture2.Height = 550 - 500 + 1 + 4
  Call Picture2.PaintPicture(Picture1.Image, 0, 0, , , 200, 400, 300 - 200 + 1, 550 - 500 + 1, vbSrcCopy)
  Set aa = Picture2.Image
  
  Set Picture2.Picture = Nothing
  Picture2.Cls
  Set Picture2.Picture = aa
penguinhzf 2014-03-17
  • 打赏
  • 举报
回复
引用 9 楼 myjian 的回复:
繁琐不是问题,关键性能是否能接受,测试一下吧. 如果这一块的代码做好了以后基本不动,繁就繁点呗.
讲的挺有道理的,但繁琐会不会比简单的操作更加占资源呢?
嗷嗷叫的老马 2014-03-17
  • 打赏
  • 举报
回复
繁琐不是问题,关键性能是否能接受,测试一下吧. 如果这一块的代码做好了以后基本不动,繁就繁点呗.
penguinhzf 2014-03-17
  • 打赏
  • 举报
回复
引用 4 楼 dianyancao 的回复:
你不用控件,那么你要用api还是自己处理截图呢?
其实我的用意就是想把某幅图的某个位置先用变量保存起来,日后如果需要调用或者显示的时候,再用控件读入,如果每次先用控件读入之后再处理,我总觉得比直接用变量读入要慢而且要繁琐啊。
dianyancao 2014-03-16
  • 打赏
  • 举报
回复
PaintPicture和BitBlt差不多,不算慢啊 如果你想获取直接的位图数据可以用PropertyBag 只要显示图片的话,还是在窗体上放一个PictureBox,设置不可见 然后用PaintPicture方法合适些
penguinhzf 2014-03-16
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
http://www.vbgood.com/thread-76287-1-1.html
不太懂看,简单点行吗?
dianyancao 2014-03-16
  • 打赏
  • 举报
回复
你不用控件,那么你要用api还是自己处理截图呢?
penguinhzf 2014-03-16
  • 打赏
  • 举报
回复
引用 2 楼 dianyancao 的回复:
vb6图像框有PaintPicture方法
 Call Picture2.PaintPicture(Picture1.Image, 0, 0, , , 200, 500, 300 - 200 + 1, 550 - 500 + 1, vbSrcCopy)
http://msdn.microsoft.com/zh-cn/library/microsoft.visualbasic.powerpacks.printing.compatibility.vb6.printer.paintpicture.aspx
用你所提供的方法,本身就是要控件,我现在不想用控件,只想用变量,能不能跳开不用控件来直接用变量来取呢?
dianyancao 2014-03-15
  • 打赏
  • 举报
回复
vb6图像框有PaintPicture方法
 Call Picture2.PaintPicture(Picture1.Image, 0, 0, , , 200, 500, 300 - 200 + 1, 550 - 500 + 1, vbSrcCopy)
http://msdn.microsoft.com/zh-cn/library/microsoft.visualbasic.powerpacks.printing.compatibility.vb6.printer.paintpicture.aspx
threenewbee 2014-03-15
  • 打赏
  • 举报
回复
http://www.vbgood.com/thread-76287-1-1.html

807

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧