public unsafe int BufferCB(double sampleTime, IntPtr buffer, int bufferLen) { if (parent.NewFrame != null) { Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb); BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); int stride = bitmapData.Stride; int stride2 = bitmapData.Stride; byte * ptr = (byte *)bitmapData.Scan0.ToPointer() + (long)stride2 * (long)(height - 1); byte * ptr2 = (byte *)buffer.ToPointer(); for (int i = 0; i < height; i++) { Win32.memcpy(ptr, ptr2, stride); ptr -= stride2; ptr2 += stride; } bitmap.UnlockBits(bitmapData); if (snapshotMode) { parent.OnSnapshotFrame(bitmap); } else { parent.OnNewFrame(bitmap); } bitmap.Dispose(); } return(0); }
// Callback method that receives a pointer to the sample buffer public int BufferCB(double sampleTime, IntPtr buffer, int bufferLen) { if (parent.NewFrame != null) { // create new image System.Drawing.Bitmap image = new Bitmap(width, height, PixelFormat.Format24bppRgb); // lock bitmap data BitmapData imageData = image.LockBits( new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); // copy image data int srcStride = imageData.Stride; int dstStride = imageData.Stride; int dst = imageData.Scan0.ToInt32( ) + dstStride * (height - 1); int src = buffer.ToInt32( ); for (int y = 0; y < height; y++) { Win32.memcpy(dst, src, srcStride); dst -= dstStride; src += srcStride; } // unlock bitmap data image.UnlockBits(imageData); // notify parent parent.OnNewFrame(image); // release the image image.Dispose( ); } return(0); }
// Callback method that receives a pointer to the sample buffer public int BufferCB(double sampleTime, IntPtr pBuffer, int bufferLen) { FrameCount++; if (FrameCount % 3 == 0) { // create new image System.Drawing.Bitmap image = new Bitmap(width, height, PixelFormat.Format24bppRgb); // lock bitmap data BitmapData imageData = image.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); // copy image data / convert from YUY2 to RGB24 if needed if (YUYV) { int l, c; int r, g, b, cr, cg, cb, y2; int r0, b0, r1, b1, y0, u, y1, v; double g0, g1; l = height; unsafe { byte *dst = (byte *)imageData.Scan0.ToPointer(); byte *src = (byte *)pBuffer.ToPointer(); while (l-- > 0) { c = width >> 1; while (c-- > 0) { if (!grayscale) { y1 = *src++; cb = ((*src - 128) * 454) >> 8; cg = (*src++ - 128) * 88; y2 = *src++; cr = ((*src - 128) * 359) >> 8; cg = (cg + (*src++ - 128) * 183) >> 8; r = y1 + cr; b = y1 + cb; g = y1 - cg; *dst++ = (byte)b; *dst++ = (byte)g; *dst++ = (byte)r; r = y2 + cr; b = y2 + cb; g = y2 - cg; *dst++ = (byte)b; *dst++ = (byte)g; *dst++ = (byte)r; } else if (grayscale) { y0 = *src++; u = *src++; y1 = *src++; v = *src++; //r0 = y0 + v - 128; //b0 = y0 + u - 128; //g0 = (y0 - .2125 * r0 - .0721 * b0) / .7514; //r1 = y1 + v - 128; //b1 = y1 + u - 128; //g1 = (y1 - .2125 * r1 - .0721 * b1) / .7514; r0 = y0; b0 = y0; g0 = y0; r1 = y1; b1 = y1; g1 = y1; *dst++ = (byte)b0; *dst++ = (byte)g0; *dst++ = (byte)r0; *dst++ = (byte)b1; *dst++ = (byte)g1; *dst++ = (byte)r1; } } } } } else if (!YUYV) { // copy image data int srcStride = imageData.Stride; int dstStride = imageData.Stride; unsafe { byte *dst = (byte *)imageData.Scan0.ToPointer() + dstStride * (height - 1); byte *src = (byte *)pBuffer.ToPointer(); for (int y = 0; y < height; y++) { for (int x = 0; x < srcStride; x++) { *dst++ = *src++; } dst -= 2 * dstStride; } } } // unlock bitmap data image.UnlockBits(imageData); // notify parent if (erode) { Bitmap ErodedImage = erosionFilter.Apply(image); parent.OnNewFrame(ErodedImage); ErodedImage.Dispose(); image.Dispose(); } else if (!erode) { parent.OnNewFrame(image); // release the image image.Dispose(); } } if (FrameCount == 30) { FrameCount = 0; } return(0); }