Solved

How to make raw bitmap data usable

Posted on 2010-11-16
2
501 Views
Last Modified: 2012-05-10
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
Comment
Question by:riceman0
2 Comments
 
LVL 96

Accepted Solution

by:
Bob Learned earned 500 total points
ID: 34155896
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
 

Author Comment

by:riceman0
ID: 34158337

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

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Icons and Colors for Terms 3 24
Anyway to make "All" the default in the dropdown? 6 33
Run time Error 4 34
Need a starter for ETL protocol? 4 31
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

947 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now