public void UpdateBitmap(Bitmap image, CopyBitmapOptions options = CopyBitmapOptions.None) { if (image.Width != FrameSize.Width || image.Height != FrameSize.Height) { throw new ArgumentException("Bitmap size if not acceptable."); } if (image.PixelFormat == PixelFormat.Format24bppRgb) { options |= CopyBitmapOptions.Force24BitRgb; } else if ((options & CopyBitmapOptions.Force24BitRgb) == CopyBitmapOptions.Force24BitRgb) { throw new ArgumentException("Requested RGB888 operation on a non-RGB24 bitmap."); } PixelFormat desiredFormat; switch (VideoMode.DataPixelFormat) { case VideoMode.PixelFormat.Rgb888: desiredFormat = PixelFormat.Format24bppRgb; break; case VideoMode.PixelFormat.Gray8: desiredFormat = PixelFormat.Format8bppIndexed; break; case VideoMode.PixelFormat.Depth1Mm: case VideoMode.PixelFormat.Depth100Um: case VideoMode.PixelFormat.Gray16: desiredFormat = PixelFormat.Format16bppGrayScale; break; default: throw new InvalidOperationException("Pixel format is not acceptable for bitmap converting."); } if ((options & CopyBitmapOptions.Force24BitRgb) != CopyBitmapOptions.Force24BitRgb && desiredFormat != image.PixelFormat) { throw new ArgumentException("Requested bitmap pixel format is not suitable for this data."); } var destBits = image.LockBits( new Rectangle(new Point(0, 0), image.Size), ImageLockMode.WriteOnly, image.PixelFormat); VideoFrameRef_copyDataTo(Handle, destBits.Scan0, destBits.Stride, options); image.UnlockBits(destBits); }
public Bitmap ToBitmap(CopyBitmapOptions options = CopyBitmapOptions.None) { PixelFormat format; switch (VideoMode.DataPixelFormat) { case VideoMode.PixelFormat.Rgb888: format = PixelFormat.Format24bppRgb; break; case VideoMode.PixelFormat.Gray8: format = PixelFormat.Format8bppIndexed; break; case VideoMode.PixelFormat.Depth1Mm: case VideoMode.PixelFormat.Depth100Um: case VideoMode.PixelFormat.Gray16: format = PixelFormat.Format16bppGrayScale; break; default: throw new InvalidOperationException("Pixel format is not acceptable for bitmap converting."); } if ((options & CopyBitmapOptions.Force24BitRgb) == CopyBitmapOptions.Force24BitRgb) { format = PixelFormat.Format24bppRgb; } var destination = new Bitmap(FrameSize.Width, FrameSize.Height, format); if (format == PixelFormat.Format8bppIndexed) { for (var i = 0; i < 256; i++) { destination.Palette.Entries[i] = Color.FromArgb(i, i, i); } } UpdateBitmap(destination, options); return(destination); }
private static extern void VideoFrameRef_copyDataTo( IntPtr objectHandler, IntPtr dstData, int dstStride, CopyBitmapOptions options);
public void UpdateBitmap(Bitmap image, CopyBitmapOptions options = CopyBitmapOptions.None) { if (image.Width != this.FrameSize.Width || image.Height != this.FrameSize.Height) { throw new ArgumentException("Bitmap size if not acceptable."); } if (image.PixelFormat == PixelFormat.Format24bppRgb) { options |= CopyBitmapOptions.Force24BitRgb; } else if ((options & CopyBitmapOptions.Force24BitRgb) == CopyBitmapOptions.Force24BitRgb) { throw new ArgumentException("Requested RGB888 operation on a non-RGB24 bitmap."); } PixelFormat desiredFormat; switch (this.VideoMode.DataPixelFormat) { case VideoMode.PixelFormat.Rgb888: desiredFormat = PixelFormat.Format24bppRgb; break; case VideoMode.PixelFormat.Gray8: desiredFormat = PixelFormat.Format8bppIndexed; break; case VideoMode.PixelFormat.Depth1Mm: case VideoMode.PixelFormat.Depth100Um: case VideoMode.PixelFormat.Gray16: desiredFormat = PixelFormat.Format16bppGrayScale; break; default: throw new InvalidOperationException("Pixel format is not acceptable for bitmap converting."); } if ((options & CopyBitmapOptions.Force24BitRgb) != CopyBitmapOptions.Force24BitRgb && desiredFormat != image.PixelFormat) { throw new ArgumentException("Requested bitmap pixel format is not suitable for this data."); } BitmapData destBits = image.LockBits( new Rectangle(new Point(0, 0), image.Size), ImageLockMode.WriteOnly, image.PixelFormat); VideoFrameRef_copyDataTo(this.Handle, destBits.Scan0, destBits.Stride, options); image.UnlockBits(destBits); }
public Bitmap ToBitmap(CopyBitmapOptions options = CopyBitmapOptions.None) { PixelFormat format; switch (this.VideoMode.DataPixelFormat) { case VideoMode.PixelFormat.Rgb888: format = PixelFormat.Format24bppRgb; break; case VideoMode.PixelFormat.Gray8: format = PixelFormat.Format8bppIndexed; break; case VideoMode.PixelFormat.Depth1Mm: case VideoMode.PixelFormat.Depth100Um: case VideoMode.PixelFormat.Gray16: format = PixelFormat.Format16bppGrayScale; break; default: throw new InvalidOperationException("Pixel format is not acceptable for bitmap converting."); } if ((options & CopyBitmapOptions.Force24BitRgb) == CopyBitmapOptions.Force24BitRgb) { format = PixelFormat.Format24bppRgb; } Bitmap destination = new Bitmap(this.FrameSize.Width, this.FrameSize.Height, format); if (format == PixelFormat.Format8bppIndexed) { for (int i = 0; i < 256; i++) { destination.Palette.Entries[i] = Color.FromArgb(i, i, i); } } this.UpdateBitmap(destination, options); return destination; }