您的位置:程序门 -> vb -> 多媒体



新手提问:图像处理相关问题~~~


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


新手提问:图像处理相关问题~~~[已结贴,结贴人:arthasalex]
发表于:2007-05-13 13:36:45 楼主
想要实现的功能是对图像平移、扭转和横竖向拉压变形的分步还原处理,目前三部分功能代码的编写已经基本完成,现在的问题是如何把它们结合起来。想法是在两个picturebox内载入两幅图像,然后对一幅经过上述三种变形的图像先后进行横竖向拉压、扭转和平移处理,直到把两幅图像化为相同。现在的问题是这三步都想在已有图像的基础上进行,即想在已有的picturebox内清除原有图像,然后生成一幅新图像,如此循环,请问各位大大如何实现,最好有详细过程讲解和相类似的示例程序,多谢大家~~~
发表于:2007-05-13 15:57:351楼 得分:0
没看明白你的目的?最好贴出代码,就具体问题提问!
发表于:2007-05-13 19:15:222楼 得分:0
目的其实就是想把一个picturebox内已有的一幅图像经过某种处理后再在这个picturebox里显示出来,相当于用处理后的图像把原来的图像覆盖掉,这个我不知道要如何实现
发表于:2007-05-13 19:43:523楼 得分:0
看你要做什么处理了。
发表于:2007-05-13 20:27:504楼 得分:0
奇了怪了,会处理不会显示?
bitblt绘入就行了。
很想问一句:显示不出来,你又是怎么知道处理得对不对呢?
发表于:2007-05-13 21:37:335楼 得分:0
下边是我现在的代码:

'打开图像1
private   sub   command2_click()
    commondialog1.filter   =   "   pictures   (*.bmp) ¦*.bmp "
    commondialog1.showopen
    filename   =   commondialog1.filename
    if   filename   <>   " "   then
            picture1.picture   =   loadpicture(filename)
    end   if
end   sub

'打开图像2
private   sub   command3_click()
    commondialog2.filter   =   "   pictures   (*.bmp) ¦*.bmp "
    commondialog2.showopen
    filename   =   commondialog2.filename
    if   filename   <>   " "   then
            picture2.picture   =   loadpicture(filename)
    end   if
end   sub

'拉压处理,m和n可以求得,处理后的图像显示在picture4内
private   sub   command6_click()
    call   stretchblt(picture4.hdc,   0,   0,   picture2.scalewidth   *   m,   picture2.scaleheight   *   n,   picture2.hdc,   0,   0,   picture2.scalewidth,   picture2.scaleheight,   vbsrccopy)
    set   picture4.picture   =   picture4.image
end   sub

我想要的效果就是把处理后的图像还显示在picture2里,而这里之前已经载入了一幅图像了
发表于:2007-05-14 09:15:326楼 得分:0
前面说的很神秘,原来“拉压”处理就是stretchblt缩放^_^

set   picture2.picture=picture4.picture
就行了

说实话,若总想着用picture属性,做图像处理是很麻烦的。若你实在弄不懂gdi函数,可用stdpicture对象,外加paintpicture方法就可满足你的要求。现在,你用的办法有些“四不象”,资源占用大、麻烦先不说,因picture传来传去,效率还不如纯vb方法高!
发表于:2007-05-14 15:23:117楼 得分:0
因为也是初学vb,想必一定是走了不少弯路,而且所谓的处理都是些最简单的方法。我的程序不仅有拉压处理,还有扭转和平移,所以不知道你所说的stdpicture和paintpicture能不能用,能给我些例子参考下么?
发表于:2007-05-14 22:09:528楼 得分:0
把你扭转和平移的代码贴出来,看看,才知道你的目的。

平移能看明白,简单指定x,y用bitblt就能完成。

扭转是哪类呢?
变形?或是旋转?或是翻转?
前两种paintpicture做不到,要用plgblt
最后一种将宽或高设为负值,可用paintpicture完成
发表于:2007-05-14 23:18:029楼 得分:0
扭转其实就是旋转,那部分代码的算法是在两幅图像上各点取两个点获得坐标值,然后计算斜率,再反求出角度,这样就可以根据两个角度的差值,用plgblt实现了。下边是扭转的代码(求角度那段的省略):

private   sub   rotate(byref   picdesthdc   as   long,   xpos   as   long,   ypos   as   long,   _
                                              byval   angle   as   long,   _
                                              byref   picsrchdc   as   long,   srcxoffset   as   long,   srcyoffset   as_   long,   byval   srcwidth   as   long,   byval   srcheight   as   long)


        dim   points(3)   as   points2d
        dim   defpoints(3)   as   points2d
        dim   thets   as   single,   thetc   as   single
        dim   ret   as   long
       
        points(0).x   =   -srcwidth   *   0.5
        points(0).y   =   -srcheight   *   0.5
       
        points(1).x   =   points(0).x   +   srcwidth
        points(1).y   =   points(0).y
       
        points(2).x   =   points(0).x
        points(2).y   =   points(0).y   +   srcheight
       
        thets   =   sin(angle   *   notpi)   'notpi   =   3.14159265238   /   180
        thetc   =   cos(angle   *   notpi)
        defpoints(0).x   =   (points(0).x   *   thetc   -   points(0).y   *   thets)   +   xpos
        defpoints(0).y   =   (points(0).x   *   thets   +   points(0).y   *   thetc)   +   ypos
       
        defpoints(1).x   =   (points(1).x   *   thetc   -   points(1).y   *   thets)   +   xpos
        defpoints(1).y   =   (points(1).x   *   thets   +   points(1).y   *   thetc)   +   ypos
       
        defpoints(2).x   =   (points(2).x   *   thetc   -   points(2).y   *   thets)   +   xpos
        defpoints(2).y   =   (points(2).x   *   thets   +   points(2).y   *   thetc)   +   ypos
       
        plgblt   picdesthdc,   defpoints(0),   picsrchdc,   srcxoffset,   srcyoffset,   srcwidth,   srcheight,   0,   0,   0

end   sub

private   sub   command7_click()
        dim   g,   h,   k   as   double
        g   =   atn((f1   -   b1)   /   (e1   -   a1))
        h   =   atn((f2   -   b2)   /   (e2   -   a2))   '(a1,b1),(a2,b2),(e1,f1),(e2,f2)是所点的参考点坐标
        k   =   h   -   g

        rotate   picture4.hdc,   picture4.scalewidth   /   2,   picture4.scaleheight   /   2,   -180   *   k   /   pi,   picture2.hdc,   0,   0,   picture2.scalewidth,   picture2.scaleheight   'pi   =   3.14159265238
        set   picture4.picture   =   picture4.image
end   sub

我的程序的处理流程是这样的:打开两幅图像(在两个picturebox内显示)---在两幅图上各点3个参考点---处理拉压---处理旋转---处理平移。
想要的效果是每处理完一种变形,新生成的图像在已有的一个picturebox里显示(原有图像被覆盖),然后处理下一种变形,新生成的图像再在该picturebox里显示,如此循环直到三种变形都处理完。然而这个目前还无法实现,只能借助于第3个picturebox,感觉很麻烦。
发表于:2007-05-15 10:33:0410楼 得分:0
这个代码我在网上见过。
能看出lz对gdi了解得不多,这种api与vb结合的用法,使你受限很多,总想着使用picture对象想复制与保存位图,没这必要。
你可能不明白,picture对象就是我说的stdpicture,不用picturebox一样可以使用stdpicture。

其实若会用gdi函数,完全可已建dc,自已建bmp对象,放弃picturebox做中转站。
按lz的需求,处理后的新位图,不可能直接覆盖原图,必须得有一个中间dc中转过渡后再覆盖。
有两种方案:
1、不用第三个picturebox,就可以自建一个内存dc代替,在这个dc中处理完成后,再清除picture中的图像,从自己dc中复制新位图过去即可。这些东西,用过很简单,没用过,得先学些相关知识;

2、暂时用picture4,不过picture4是可以隐藏起来的(相当于vb帮你建的内存dc了),需让picture4.autoredraw=true。
set   picture4.picture   =   picture4.image可不要,
直接复制进picture2
set   picture2.picture   =   nothing   '先清除原图
复制有两种:
bitblt   picture2.hdc,0,0,picture4.scalewidth,picture4.scaleheight,picture4.hdc,0,0,vbsrccopy
'picture2.refresh   '若没显示,加上这句
picturebox都要用像素做单位


picture2.paintpicture   picture4.image,0,0
发表于:2007-05-15 13:57:1011楼 得分:0
非常感谢小吉!耐心帮助了我这么多!不过还有一些疑问:
我使用了你说的第二种方法,用的是bitblt语句,关于你说的“picture4是可以隐藏起来的”意思是在界面上放上叫picture4的picturebox而不用来显示图像是吧?
还有一个就是这种方法可以重复使用么,就是说picture4作为一个中介能多次利用么,不但这个旋转时用,以后的拉压我也想用可以么?
第三个疑问,我还是对你说的第一种方法更感兴趣,能给我一些思路上的指导么,告诉我应该按什么步骤来做,需要学习些什么函数,我以后可以慢慢来消化。
发表于:2007-05-18 08:53:4412楼 得分:50
“picture4是可以隐藏起来的”意思是在界面上放上叫picture4的picturebox而不用来显示图像是吧?
===============
是的,将其visible=false

说picture4作为一个中介能多次利用么
=================
可以,每次中转时,在绘入新内容前,若只是绘入正常不透明矩形,直接使用,若有透明或不规则形状需求,需先cls擦掉旧图。不要用它的picture属性。

我还是对你说的第一种方法更感兴趣
=================
gdi函数使用可以参见msdn,示例其中也有,网上可搜到更多,有兴趣就要多找找。哪里不懂可在论坛上多问问。



快速检索

最新资讯
热门点击