目前准备做一个tiff图像自动整理的程序,图像性质是扫描的西文期刊功能包括
1、计算出倾斜多少度,并校正
2、清除行之间的污点
3、清除版心周围空白处的污点目前初步确定ImgEdit和Picture两个控件结合使用。
使用Picture控件的Point函数来读像素,通过像素值判断倾斜度和污点难点就是各种算法,例如倾斜度是纵向读取判断还是横向读取判断,误点大小如何区别i或者j上面的点。欢迎大家前来讨论,如果有相同的经验,请不吝赐教。
同时我也会把我最新的进展写在这个帖子里面。

解决方案 »

  1.   

    2007年3月21日准备逐列逐行读取像素,通过调整picture的left和top来使指定区域显示。可是发现这样读出来的效果并不准确,原因是频繁的上下调整top,会在屏幕上留下黑点,所以读出来的像素很不准确。后来每调整一次top或者left时,就让picture执行一次cls。这样读取完全正确了,可是速度很慢。正在考虑把像素装载一个二维数组,并且每页图象争取只调整4~6次left和top。
      

  2.   

    Point函数来读像素,效率太低了
      

  3.   

    http://tech.acnow.net/Html/Program/VB/GUI/2005-8/7/225104251.shtml
    这上面有你需要的完整代码
      

  4.   

    设置picture1的scalemode为3Private Type BITMAPINFOHEADER       '40 bytes
       biSize As Long                   'BITMAPINFOHEADER结构的大小
       biWidth As Long
       biHeight As Long
       biPlanes As Integer              '设备的为平面数,现在都是1
       biBitCount As Integer            '图像的颜色位图
       biCompression As Long            '压缩方式
       biSizeImage As Long              '实际的位图数据所占字节
       biXPelsPerMeter As Long          '目标设备的水平分辨率
       biYPelsPerMeter As Long          '目标设备的垂直分辨率
       biClrUsed As Long                '使用的颜色数
       biClrImportant As Long           '重要的颜色数。如果该项为0,表示所有颜色都是重要的
    End Type
      
    Private Type RGBQUAD                '只有bibitcount为1,2,4时才有调色板
       Blue As Byte                     '蓝色分量
       Green As Byte                    '绿色分量
       Red As Byte                      '红色分量
       Reserved As Byte                 '保留值
    End TypePrivate Type BITMAPINFO
      bmiHeader As BITMAPINFOHEADER
      bmiColors As RGBQUAD
    End TypePrivate Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
    Private Declare Function SetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As LongPrivate Sub GetPicData(Pic As PictureBox, PicData() As RGBQUAD)              '读取位图数据
        Dim DIBInfo As BITMAPINFO
        With DIBInfo.bmiHeader
            .biSize = Len(DIBInfo.bmiHeader)
            .biWidth = Pic.ScaleWidth
            .biHeight = -Pic.ScaleHeight       '从下往上扫描
            .biPlanes = 1
            .biBitCount = 32                        '32位位图,默认情况下Windows不会处理最高8位,可以将它作为自己的Alpha通道
            .biCompression = BI_RGB                 '无压缩
        End With
        ReDim PicData(1 To Pic.ScaleWidth, 1 To Pic.ScaleHeight) As RGBQUAD
        GetDIBits Pic.hdc, Pic.Image, 0, Pic.ScaleHeight, PicData(1, 1), DIBInfo, DIB_RGB_COLORS
    End SubPrivate Sub ShowPic(Pic As PictureBox, PicData() As RGBQUAD)        '显示位图
        Dim DIBInfo As BITMAPINFO
        With DIBInfo.bmiHeader
            .biSize = Len(DIBInfo.bmiHeader)
            .biWidth = Pic.ScaleWidth
            .biHeight = -Pic.ScaleHeight       '从下往上扫描
            .biPlanes = 1
            .biBitCount = 32                        '32位位图,默认情况下Windows不会处理最高8位,可以将它作为自己的Alpha通道
            .biCompression = BI_RGB                 '无压缩
        End With
        SetDIBits Pic.hdc, Pic.Image, 0, Pic.ScaleHeight, PicData(1, 1), DIBInfo, DIB_RGB_COLORS
        Pic.Refresh
    End Sub
    Private Sub Command1_Click()
        Dim PicData() As RGBQUAD
        GetPicData Picture1, PicData
        Dim i As Integer, j As Integer
        For i = 1 To Picture1.ScaleWidth
            For j = 1 To Picture1.ScaleHeight
                PicData(i, j).Red = 255 - PicData(i, j).Red
                PicData(i, j).Green = 255 - PicData(i, j).Green
                PicData(i, j).Blue = 255 - PicData(i, j).Blue
            Next
        Next
        ShowPic Picture1, PicData
    End Sub
      

  5.   


    也可以将数据保存在三位数组中
    Public Sub GetImageData(Pic As PictureBox, PicData() As Byte)
        Dim DIBInfo As BITMAPINFO
        With DIBInfo.bmiHeader
            .biSize = Len(DIBInfo.bmiHeader)
            .biWidth = Pic.ScaleWidth
            .biHeight = -Pic.ScaleHeight       '从下往上扫描
            .biPlanes = 1
            .biBitCount = 32                        '32位位图,默认情况下Windows不会处理最高8位,可以将它作为自己的Alpha通道
            .biCompression = BI_RGB                 '无压缩
        End With
        ReDim PicData(1 To 4, 1 To Pic.ScaleWidth, 1 To Pic.ScaleHeight) As Byte
        GetDIBits Pic.hdc, Pic.Image, 0, Pic.ScaleHeight, PicData(1, 1, 1), DIBInfo, DIB_RGB_COLORS
    End Sub
    但这时PicData(1,i,j)表示blue,PicData(2,i,j)表示Green,PicData(3,i,j)表示Red,
    三维数组比结构体满,二维和一维都比结构体快,但坐标转换比较麻烦,当然上面的都是对24位的图像。
      

  6.   

    看完上面两位大侠的指点,我只能说四个字“如获至宝”啊。我还会继续把我的进程详细写在这个帖子里面,就当写BLOG了。
      

  7.   

    2007年3月29日图像的倾斜度基本已经搞定了,具体算法为:由左边界开始扫描,从开始发现黑色素到黑色素达到平均值,在这个距离内的长度和版心的高度通过直角三角形的函数进行换算,这样就知道了倾斜的角度。下面面临两个难点:一、如何自由角度旋转图像。可以旋转图像的控件很多,但是可以任意角度旋转图像的控件不多。正在考虑FoxCBmp3.dll。
    二、如何读出区域像素。通过上面两位大哥的指点,已经可以快速读出某点的像素值。但是我要做到的是去除图像上面的杂点,这样的话虽然也能实现,但是比较麻烦,也比较慢。如果能划定一片区域,然后返回这片区域里面有多少像素就太OK了。
      

  8.   

    自由旋转图像也很简单的,利用DIB完全可以做
    想划定一片区域处理也不难,可以先拷贝你想要的区域到内存,然后读取改区域的数据
      

  9.   

    2007年4月5日这几天一直忙一个别的项目,一直没有搞这个。TO楼上,人一定要靠自己,可我一定要靠CSDN,呵呵。很多朋友建议我要搞图像编程,最好用.net,据说那里面图像控件比较强大一些。还说什么磨刀不误砍柴工,可我实在不想再学.net了,因为程序员这个工作我也不打算长期干了,呵呵。楼上的兄弟,“想划定一片区域处理也不难,可以先拷贝你想要的区域到内存,然后读取改区域的数据”,这个对我实在比较难,可否给一定提示,或者源代码,谢谢。
      

  10.   

    .NET的库函数确实很丰富,但要带个.net framework,我不喜欢,6.0下的图像编程其实也是很方便的,gdi也很强大,最近看了模拟指针技术和dibsection,发现其实在VB里的处理速度也不会比VC差多少了,也比直接用GetDibBits这个函数得到图像数据后在处理的速度快了很多。如果要划定一片处理区域,可以用bitblt把他拷贝到另外一个容器里,然后在得到这个数据。