目前准备做一个tiff图像自动整理的程序,图像性质是扫描的西文期刊功能包括
1、计算出倾斜多少度,并校正
2、清除行之间的污点
3、清除版心周围空白处的污点目前初步确定ImgEdit和Picture两个控件结合使用。
使用Picture控件的Point函数来读像素,通过像素值判断倾斜度和污点难点就是各种算法,例如倾斜度是纵向读取判断还是横向读取判断,误点大小如何区别i或者j上面的点。欢迎大家前来讨论,如果有相同的经验,请不吝赐教。
同时我也会把我最新的进展写在这个帖子里面。
1、计算出倾斜多少度,并校正
2、清除行之间的污点
3、清除版心周围空白处的污点目前初步确定ImgEdit和Picture两个控件结合使用。
使用Picture控件的Point函数来读像素,通过像素值判断倾斜度和污点难点就是各种算法,例如倾斜度是纵向读取判断还是横向读取判断,误点大小如何区别i或者j上面的点。欢迎大家前来讨论,如果有相同的经验,请不吝赐教。
同时我也会把我最新的进展写在这个帖子里面。
解决方案 »
- VB里面怎样给数组里面放30个数字,然后把数组里面的数字随机显示出来?
- 怎么用程序获得select count(*)的返回结果
- 请问那位高手帮忙txt文件变成EXCEL文件
- VB操作Excel问题
- 关于MScomm控件,高手请进
- 通过vb怎样设置一个excel表的一列为文本类型?
- 请教:VB中ModalDialog函数的解释及举例
- 为什么在不同系统下报表会向下偏移
- 怎样用一个SQL语句来同时操作SQL Server中两个数据库的表
- 在VB的ADOC控件中怎么加过滤条件,让他的数据源是多张表里的,但是有限定的
- winsock控件收发数据乱码问题
- 疑难问题: vb6.exe 中发生未处理的win32异常
这上面有你需要的完整代码
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
也可以将数据保存在三位数组中
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位的图像。
二、如何读出区域像素。通过上面两位大哥的指点,已经可以快速读出某点的像素值。但是我要做到的是去除图像上面的杂点,这样的话虽然也能实现,但是比较麻烦,也比较慢。如果能划定一片区域,然后返回这片区域里面有多少像素就太OK了。
想划定一片区域处理也不难,可以先拷贝你想要的区域到内存,然后读取改区域的数据