private void HandleDataReceived( IntPtr device, IntPtr imageData, UInt32 timeStamp )
{
int width = videoModeInfo.Width;
int height = videoModeInfo.Height;
Bitmap image = null;
BitmapData data = null;
try
{
image = ( cameraMode == VideoCameraMode.Color ) ?
new Bitmap( width, height, PixelFormat.Format24bppRgb ) :
AForge.Imaging.Image.CreateGrayscaleImage( width, height );
data = image.LockBits( new Rectangle( 0, 0, width, height ),
ImageLockMode.ReadWrite, image.PixelFormat );
unsafe
{
byte* dst = (byte*) data.Scan0.ToPointer( );
byte* src = (byte*) imageBuffer.ToPointer( );
if ( cameraMode == VideoCameraMode.Color )
{
// color RGB 24 mode
int offset = data.Stride - width * 3;
for ( int y = 0; y < height; y++ )
{
for ( int x = 0; x < width; x++, src += 3, dst += 3 )
{
dst[0] = src[2];
dst[1] = src[1];
dst[2] = src[0];
}
dst += offset;
}
}
else
{
// infra red mode - grayscale output
int stride = data.Stride;
if ( stride != width )
{
for ( int y = 0; y < height; y++ )
{
SystemTools.CopyUnmanagedMemory( dst, src, width );
dst += stride;
src += width;
}
}
else
{
SystemTools.CopyUnmanagedMemory( dst, src, width * height );
}
}
}
image.UnlockBits( data );
framesReceived++;
bytesReceived += width * height;
}
catch ( Exception ex )
{
if ( VideoSourceError != null )
{
VideoSourceError( this, new VideoSourceErrorEventArgs( ex.Message ) );
}
if ( image != null )
{
if ( data != null )
{
image.UnlockBits( data );
}
image.Dispose( );
image = null;
}
}
if ( image != null )
{
if ( NewFrame != null )
{
NewFrame( this, new NewFrameEventArgs( image ) );
}
image.Dispose( );
}
}
}