IpDocGetLine and IpDocGetArea in VB.Net
(Originally posted by ytsejamr on 8/13/2007)
Hi there,
I'm having some difficulty with the aforementioned functions in my program I'm developing in VB.Net (2005)
Here's an example:
Din dInfo as IPDOCINFO
ret = IpDocGetInfo(GETDOCINFO, DOCSEL_ACTIVE, dInfo)
Dim imgBuf(dInfo.Width*3-1, dInfo.Height-1) as Byte
ret = IpDocGetArea(DOCSEL_ACTIVE, dInfo.Extent, imgBuf(0, 0), CPROG)
For i As Integer = 0 To imgBuf.GetUpperBound(1)
For j As Integer = 0 To imgBuf.GetUpperBound(0)
Debug.Print(imgBuf(j,i))
Next
Next
Now when I run the above code, it looks like the
RGB values in the imgBuf variable are transposed somehow. I assumed
data would be R1G1B1R2G2B2.....etc for each horizontal line in the
image. It looks like it's putting each line of RGB values "vertically"
R1 R161
G1 G161
B1 B161
R2 R162
G2 G162
B2 B162
. .
. .
. .
And what might be a similar problem. I tried reading in the image data using IpDocGetLine as follows:
ret = IpDocGetInfo(GETDOCINFO, DOCSEL_ACTIVE, dInfo)
Dim docInst As Integer = IpDocOpenAoi(DOCSEL_ACTIVE, IMA_RD)
Dim LineBuf(dInfo.Width * 3 - 1) As Byte
For i As Integer = 0 To dInfo.Height - 1
ret = IpDocGetLine(docInst, i, LineBuf(0))
Next
ret = IpDocCloseVri(docInst)
When I run this code, my LineBuf variable only has data every other index. (R1,0,G1,0,B1,0,R2,0,G2,0,B2 . . . etc)
I have the two functions declared in the ipc32.vb file as follows:
Declare Function IpDocGetLine Lib "IPC32" (ByVal iiInst As Integer, ByVal LineNum As Short, ByRef LineBuf As Byte) As Integer
Declare Function IpDocGetArea Lib "IPC32" (ByVal DocId As Short, ByRef rArea As RECT, ByRef lpBuf As Byte, ByVal gMode As Short) As Integer
I'm
getting lost here. My main goal is to get the bitmap data of the
current image into a array of bytes that I can then use with the .Net
System.Drawing.Bitmap class.
I hope this kind of makes sense. It's tough to explain . . .
Comments
(Originally posted by YuriG on 8/15/2007)
You have to use Integer type for line buffer (you used Byte). Please test the following macro that inverts red channel of the active image:
Sub InvertRedChannel() Dim i As Integer Dim j As Integer Dim imInfo As IPDOCINFO Dim docInst As Long docInst=IpDocOpenAoi(DOCSEL_ACTIVE,IMA_RDWR) If docInst=0 Then MsgBox "Error open" Exit Sub End If ret = IpDocGet(GETDOCINFO, DOCSEL_ACTIVE, imInfo) ReDim LineBuf(1 To imInfo.Width * 3) As Integer For j=1 To imInfo.Height ret=IpDocGetLine(docInst,j-1,LineBuf(1)) For i=1 To imInfo.Width * 3 Step 3 LineBuf(i) = 255-LineBuf(i) Next i ret=IpDocPutLine(docInst,j-1,LineBuf(1),1) Next j ' close the instance. ret=IpDocCloseVri(docInst) ' refresh the display of the active document. ret=IpAppUpdateDoc(DOCSEL_ACTIVE) End Sub