• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 528
  • Last Modified:

How to make raw bitmap data usable

Hello, I have some camera hardware that -- using the provided sample code -- I am able to use their functions to pull raw data out of (it says that it is in RGB24 format) and there is some other code that seems to create a corresponding BITMAPINFOHEADER structure.  But I don't know how to turn this into something I can use.  To clarify, below is the code.



    Structure LUCAM_FRAME_FORMAT
        Dim xOffset As Integer
        Dim yOffset As Integer
        Dim width As Integer
        Dim height As Integer
        Dim pixelFormat As Integer
        Dim subSampleX As Short
        Dim flagsX As Short
        Dim subSampleY As Short
        Dim flagsY As Short
    End Structure

 Public FrameFormat As LUCAM_FRAME_FORMAT

Public BitmapFrame() As Byte
...

LucamGetFormat(hCamera, myFrameFormat, FrameRate)

        ret = LucamConvertFrameToRgb24(hCamera, BitmapFrame, MyFrame, FrameFormat.width, FrameFormat.height, FrameFormat.pixelFormat, Conversion)

Open in new window


which apparently returns the image data in the BitmapFrame array, and then it creates a standard BITMAPINFOHEADER structure with the following

  Dim bmpInfo As BITMAPINFOHEADER

        ' Display captured frame
        bmpInfo.biBitCount = 24
        bmpInfo.biClrImportant = 0
        bmpInfo.biClrUsed = 0
        bmpInfo.biCompression = 0 ' BI_RGB
        bmpInfo.biHeight = FrameFormat.height
        bmpInfo.biPlanes = 1
        bmpInfo.biSize = 40 ' SizeOf(BITMAPINFOHEADER)
        bmpInfo.biSizeImage = FrameFormat.width * FrameFormat.height * 3
        bmpInfo.biWidth = FrameFormat.width
        bmpInfo.biXPelsPerMeter = 0
        bmpInfo.biYPelsPerMeter = 0

Open in new window


and then it does some other things with this data (feeds it into its own functions) that are not useful to me.  what I need to do is stop it here, and turn the data into my own .NET System.Drawing.Bitmap object so that I can do whatever I want with it.

But so far I have not been able to string together the code to convert the raw byte array, that apparently matches up with this BITMAPINFOHEADER, into my own .NET bitmap.  Does anyone have any suggestions?  

Thanks VERY much in advance.


0
riceman0
Asked:
riceman0
1 Solution
 
Bob LearnedCommented:
That is a great question, but one without a specific answer from me.  I do have some code to export a frame from an .avi file to a Bitmap, that might prove useful as food for thought.


Public Sub ExportBitmap(ByVal position As Integer, ByVal dstFileName As String)
		If position > CountFrames Then
			Throw New Exception("Invalid frame position")
		End If
		Dim pDib As Integer = Avi.AVIStreamGetFrame(m_getFrameObject, m_firstFrame + position)
		Dim bih As Avi.BITMAPINFOHEADER = New Avi.BITMAPINFOHEADER
		bih = CType(Marshal.PtrToStructure(New IntPtr(pDib), bih.GetType), Avi.BITMAPINFOHEADER)
		If bih.biSizeImage < 1 Then
			Throw New Exception("Exception in AVIStreamGetFrame: Not bitmap decompressed.")
		End If
		Dim bitmapData(bih.biSizeImage) As Byte
		Dim address As Integer = pDib + Marshal.SizeOf(bih)
		For offset As Integer = 0 To bitmapData.Length - 1
			bitmapData(offset) = Marshal.ReadByte(New IntPtr(address))
			address += 1
		Next offset
		Dim bitmapInfo(Marshal.SizeOf(bih)) As Byte
		Dim ptr As IntPtr = Marshal.AllocHGlobal(bitmapInfo.Length)
		Marshal.StructureToPtr(bih, ptr, False)
		address = ptr.ToInt32
		For offset As Integer = 0 To bitmapInfo.Length - 1
			bitmapInfo(offset) = Marshal.ReadByte(New IntPtr(address))
			address += 1
		Next offset
		Dim bfh As Avi.BITMAPFILEHEADER = New Avi.BITMAPFILEHEADER
		bfh.bfType = Avi.BMP_MAGIC_COOKIE
		bfh.bfSize = 55 + bih.biSizeImage
		bfh.bfReserved1 = 0
		bfh.bfReserved2 = 0
		bfh.bfOffBits = Marshal.SizeOf(bih) + Marshal.SizeOf(bfh)

        Using fs As New FileStream(dstFileName, System.IO.FileMode.Create)

            Dim bw As New BinaryWriter(fs)

            bw.Write(bfh.bfType)
            bw.Write(bfh.bfSize)
            bw.Write(bfh.bfReserved1)
            bw.Write(bfh.bfReserved2)
            bw.Write(bfh.bfOffBits)
            bw.Write(bitmapInfo)
            bw.Write(bitmapData)
            bw.Close()
        End Using

End Sub

Open in new window

0
 
riceman0Author Commented:

That gave me enough ammunition to post a question back to the vendor, thanks.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now