Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Converting/marshalling '1 dimensional array of Byte' to 'System.Intptr'

Posted on 2010-11-17
2
1,031 Views
Last Modified: 2012-05-10

Hello, I am completely novice at marshalling, managed/unmanaged concerns, etc.  I have a camera SDK that is giving me data in a format

 Public BitmapData() As Byte

And I want to plug it into my Bitmap constructor of

Public Sub New ( _
    width As Integer, _
    height As Integer, _
    stride As Integer, _
    format As PixelFormat, _
    scan0 As IntPtr _
)

I'm sure I have the correct width, height, format, etc, but can;t seem to plug my BitmapData into the IntPtr.  I get an error.

"Value of type '1-dimensional array of Byte' cannot be converted to 'System.IntPtr'."

Does anyone know how to fit this round peg into the square hole?

In C# they do it like this:

            fixed (byte* ptr = pBmp)
            {
                image = new Bitmap(frame.Width / frame.SubSampleX, frame.Height / frame.SubSampleY, 3 * frame.Width / frame.SubSampleX, PixelFormat.Format24bppRgb,  (IntPtr)ptr);
            //    image.RotateFlip(RotateFlipType.RotateNoneFlipY);
            }

Open in new window


But I don't think I can do that in VB.NET.    Any thoughts?  Thanks.
0
Comment
Question by:riceman0
2 Comments
 
LVL 29

Assisted Solution

by:nffvrxqgrcfqvvc
nffvrxqgrcfqvvc earned 200 total points
ID: 34158846
Using the Marshal Class allocate a IntPtr buffer the same size as your byte array using Marshal.AllocHGlobal() then use Marshal.Copy() to copy the byte array into your allocated pointer. Pass the pointer then release it when your finished.

Here is an example using a blank byte array thats 64 bytes.
Dim bBitmapData(64 - 1) As Byte
Dim pBitmapData As IntPtr = Marshal.AllocHGlobal(bBitmapData.Length)
Marshal.Copy(bBitmapData, 0, pBitmapData, bBitmapData.Length)
'TODO: Pass pBitmapData
Marshal.FreeHGlobal(pBitmapData)

Open in new window

0
 
LVL 32

Accepted Solution

by:
Erick37 earned 300 total points
ID: 34159290
You can give this sample a try.  Be sure the ImageBytes array contains the bitmap bytes.
Option Explicit On
Option Strict On

Imports System.Runtime.InteropServices
Imports System.Drawing.Imaging

Public Class Form1

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

		Dim bmd As BitmapData

		'' Your picture data
		Dim ImageBytes() As Byte ''Must be populated

		'' Create a blank bitmap of the same size and format of your target
		Dim bm As Bitmap = New Bitmap(frame.Width, frame.Height, PixelFormat.Format24bppRgb)

		'' Lock the bitmap data.
		Dim rc As Rectangle = New Rectangle(0, 0, bm.Width, bm.Height)
		bmd = bm.LockBits(rc, Imaging.ImageLockMode.ReadWrite, Imaging.PixelFormat.Format24bppRgb)

		'' Calculate the size of the data
		Dim bmsize As Integer = bmd.Stride * bmd.Height

		'' Copy the data into the bitmap array.
		Marshal.Copy(ImageBytes, 0, bmd.Scan0, bmsize)

		bm.UnlockBits(bmd)

		''The new bitmap is bm

	End Sub

End Class

Open in new window

0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
VB.NET - Error - Object not set in Module 4 39
Store results in vb.net 3 24
Open a link in vb.net 2 16
Visual studio 2015 1 22
Article by: jpaulino
XML Literals are a great way to handle XML files and the community doesn’t use it as much as it should.  An XML Literal is like a String (http://msdn.microsoft.com/en-us/library/system.string.aspx) Literal, only instead of starting and ending with w…
Since .Net 2.0, Visual Basic has made it easy to create a splash screen and set it via the "Splash Screen" drop down in the Project Properties.  A splash screen set in this manner is automatically created, displayed and closed by the framework itsel…

860 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