从 IntPtr 缓冲区创建图像后图像需要翻转
Image needs to flip after creating a image from IntPtr buffer
我正在尝试使用 DirectShow 过滤器从网络摄像头获取图像。
我想在 PictureBox 上显示该图像。
为此,我必须旋转该图像。
代码示例:
public int BufferCB(double sampleTime, IntPtr pbuffer, int bufferLen)
{
if (pbuffer == IntPtr.Zero || bufferLen == 0) return 0;
var timeStamp = TimeSpan.FromSeconds(sampleTime);
var image = new Bitmap(_videoResolution.Width, _videoResolution.Height, _stride, PixelFormat.Format24bppRgb, pbuffer);
image.RotateFlip(RotateFlipType.Rotate180FlipX);
RaiseFrameGrabbedEvent(image, timeStamp, pbuffer);
return 0;
}
有什么方法可以避免这种旋转。
您需要翻转图像,因为视频 RGB 格式中的正常行顺序是相反的,即图像从下到上。 Bitmap
class 构造函数按从上到下的顺序获取图像行。
您可以加载翻转图像并通过 image.RotateFlip
调用进行更正。
或者,您可以逐行将图像加载到 Bitmap 实例,以相反的顺序提供它们。如果您为第一行提供负步幅和相应的偏移量,也许它也可以立即解决(一些 API 接受这个,其他的不接受)。
或者,您可以将 Sample Grabber 设置为使用带负步幅的 RGB 格式,在这种情况下,抓取器缓冲区将具有正确的行顺序,但这需要您的管道中对此类 RGB 格式有一定的支持,而这不是有可能。
最终,在大多数情况下,您将不得不按照现在的方式进行翻转,或者像我上面提到的那样将图像数据加载到位图。
我正在尝试使用 DirectShow 过滤器从网络摄像头获取图像。
我想在 PictureBox 上显示该图像。
为此,我必须旋转该图像。
代码示例:
public int BufferCB(double sampleTime, IntPtr pbuffer, int bufferLen)
{
if (pbuffer == IntPtr.Zero || bufferLen == 0) return 0;
var timeStamp = TimeSpan.FromSeconds(sampleTime);
var image = new Bitmap(_videoResolution.Width, _videoResolution.Height, _stride, PixelFormat.Format24bppRgb, pbuffer);
image.RotateFlip(RotateFlipType.Rotate180FlipX);
RaiseFrameGrabbedEvent(image, timeStamp, pbuffer);
return 0;
}
有什么方法可以避免这种旋转。
您需要翻转图像,因为视频 RGB 格式中的正常行顺序是相反的,即图像从下到上。 Bitmap
class 构造函数按从上到下的顺序获取图像行。
您可以加载翻转图像并通过 image.RotateFlip
调用进行更正。
或者,您可以逐行将图像加载到 Bitmap 实例,以相反的顺序提供它们。如果您为第一行提供负步幅和相应的偏移量,也许它也可以立即解决(一些 API 接受这个,其他的不接受)。
或者,您可以将 Sample Grabber 设置为使用带负步幅的 RGB 格式,在这种情况下,抓取器缓冲区将具有正确的行顺序,但这需要您的管道中对此类 RGB 格式有一定的支持,而这不是有可能。
最终,在大多数情况下,您将不得不按照现在的方式进行翻转,或者像我上面提到的那样将图像数据加载到位图。