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



辛苦几个星期的代码,今早要被我否决,郁闷~~~


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


辛苦几个星期的代码,今早要被我否决,郁闷~~~[已结贴,结贴人:dazuo0312]
发表于:2008-01-03 09:57:02 楼主
  vb做图像处理方面的程序确实很困难啊!

        在网上搜索~~说实话找到的不是被封的严严实实的dll,就是那些不健全的处理代码!

用getpixel和setpixel太慢,可偏偏网上和出版的书上基本都是用它们!这些作者,都是混!用那么慢的处理来介绍算法,~~~~不实用啊!

        搜到vb图像处理,(一)像素的获取和输出,作者确实费了一片心思,我是百般佩服!拿来他的代码,运行,没错,但与预期结果不一样,苦思冥想啊,终于解决(picture控件的autoredraw设为ture   否则获取的图像不是picture控件中的图像,scalemode=3   pixel像素模式'否则程序速度很慢!),自己参照他的代码编写了一个类~~测试,正常!

        再小波变换算法研究了两个星期,终于有些头绪,参照vc代码和算法公式,先写了个测试的,没想到程序没错,结果不对!哎!继续改,想,昨夜一晚似睡非睡~~知道了,我写的代码应该彻底推翻,那个图像处理的类,本身就有缺陷!用getdibits确实获得了像素值,对于一些什么反像,插值……看不出破绽,但这个函数返回的像素值的扫描顺序有问题,获得一个三维数组picdata(i,inputwid,inputhei)

经下面的代码:

        for   j   =   0   to   inputhei
                for   k   =   0   to   inputwid   \   4
                        picdata(0,   k,   j)   =   cbyte(0)
                        picdata(1,   k,   j)   =   cbyte(0)
                        picdata(2,   k,   j)   =   cbyte(0)
              next
        next
得到的图像是



应该得到类似下面的图像:

可能是getdibits函数的读取图像的顺序不一样。上面的图像是我修改程序后得到的,可是大家也看得出黑色部分并不齐整,实在是想不出什么好办法了!只有全部否决重来了!下次试试用指针——safearray!

  也不知道自己对getdibits的评价对不对,希望得到大家的指点谢谢!  
该帖包含附件:
发表于:2008-01-03 11:52:071楼 得分:20
我想我找到原因了。

首先,你使用了picture1.picture.handle,调试时可以看到得到的图像不是pixel为单位的。
其次,在你循环中使用的d   =   (k   -   j   +   inputwid   +   inputwid)   mod   (inputwid   +   1)
是会随着实际循环变量而改变的,实际规律是随着y方向的坐标变大,而d呈现螺旋状下降,但是因为你的坐标系统并非象素,你无法直接观察到这一点,你只能看到当d下降到一定量之后才引发的pixel的改变。

还有一点值得注意,图像大小应该写成
inputwid   =   bmp.bmwidth   -   1
inputhei   =   bmp.bmheight   -   1
with   bi24bitinfo.bmiheader
      .bibitcount   =   bits
      .bicompression   =   0&
      .biplanes   =   1
      .bisize   =   len(bi24bitinfo.bmiheader)
      .biwidth   =   inputwid
      .biheight   =   inputhei
end   with
因为你后面程序中所有的循环都是从0开始的,虽然目前你的程序还能运行,但是实际上的边界已经出了问题。
发表于:2008-01-03 11:54:292楼 得分:0
dib获得和dib输出合在一起使用,就不会有问题,因为他们的垂直方向是从下向上的,和一般的电脑坐标习惯不同。
发表于:2008-01-03 12:04:493楼 得分:0
回收第一个答复,刚发现在form中传过去的是twip,而后面dibget的时候已经是pixel了,
---
但是,你题目中所说的黑色边缘不整齐就是因为
d       =       (k       -       j       +       inputwid       +       inputwid)       mod       (inputwid       +       1)  
这一句的效果
发表于:2008-01-04 11:30:264楼 得分:0
非常感谢你啊!确实是
inputwid       =       bmp.bmwidth       -       1  
inputhei       =       bmp.bmheight       -       1  
以及相关的所有代码错了.刚刚改过,测试正确!
谢谢,结贴.
交个朋友~~~~~~~~~~~~~~~


快速检索

最新资讯
热门点击