要处理一个图像,首先要获得该图像的像素值,而VB本身提供的PICTURE控件虽然可以打开很多类型的图片,但是它提供的那个POINT方法读取像素实在是太慢。而使用GetPixel这个API的速度也快不到哪里去,因为PIONT方法本身就是对于GetPixel的一个包装。
在VB中要快速获取一幅在PICTURE中打开的图像比较快速的方法是使用DIB方法,当然还有DDB方法,不过使用DDB方法还需要考虑不同颜色深度的图像的分别处理,在程序的实现上要相对复杂,而使用DIB方法则不必,并且在处理速度上比DDB方法也慢的有限。
过程一:获得一个在PICTURE控件中打开的图像的所有像素。
Public Sub DibGet(ByVal IdSource As Long, XBegin As Long, ByVal YBegin
As Long, ByVal XEnd As Long, ByVal YEnd As Long) Dim iBitmap As
Long Dim iDC As Long Dim I As LongDim Dim W As
Long Dim H As Long
On Error GoTo ErrLine Done =
False TimeGet = timeGetTime InPutWid = XEnd - XBegin InPutHei
= YEnd - YBegin W = InPutWid + 1 H = InPutHei + 1
I =
(Bits \ 8) - 1 ReDim ColVal(I, InPutWid, InPutHei) With
bi24BitInfo.bmiHeader .biBitCount = Bits .biCompression =
0& .biPlanes = 1 .biSize =
Len(bi24BitInfo.bmiHeader) .biWidth = W .biHeight = H End
With
iBitmap = GetCurrentObject(IdSource, 7&) GetDIBits
IdSource, iBitmap, 0&, H, ColVal(0, 0, 0), bi24BitInfo, 0&
DeleteObject iBitmap Done = True TimeGet = timeGetTime -
TimeGetExit Sub ErrLine: MsgBox "错误号:" & Err.Number & ":"
& Err.Description End
Sub 在这个过程中所用到的只是一些参数的设定和API的调用,不涉及算法。
过程二:图像输出的过程:
Public Sub DIBPut(ByVal IdDestination As Long) Dim W As
Long Dim H As Long
On Error GoTo ErrLine Done =
False TimePut = timeGetTime
W = OutPutWid + 1 H =
OutPutHei + 1
With bi24BitInfo.bmiHeader .biWidth =
W .biHeight = H LineBytes = ((W * Bits + 31) And &HFFFFFFE0)
\ 8 .biSizeImage = LineBytes * H End With SetDIBitsToDevice
IdDestination, 0, 0, W, H, 0, 0, 0, H, ColOut(0, 0, 0),
bi24BitInfo.bmiHeader, 0
Done = True TimePut = timeGetTime -
TimePut Exit Sub ErrLine: MsgBox Err.Description End
Sub
|