代码如下。在创建位图的步骤中,我收到“参数无效”异常。我猜测 scrapResult.PixelData 不是 C# 可以转换为图像的格式,但我不确定如何弥补这一差距。我已经确认相机正在 Mono8 中拍照。
IGrabResult grabResult = camera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);
using (grabResult)
{
if (grabResult.GrabSucceeded)
{
byte[] buffer = grabResult.PixelData as byte[];
using (var ms = new MemoryStream(buffer))
{
ms.Seek(0, SeekOrigin.Begin);
var bmp = new Bitmap(ms);
}
}
}
有两种将图像表示为字节的通用方法。使用某种类型的文件格式,例如 .png、.jpeg 等。这些文件格式通常经过压缩以减小大小,并包含各种类型的元数据。
basler 使用的另一个是原始像素数据。要利用此功能,您需要元数据,例如图像宽度、高度、步幅和像素格式,以正确重建图像。
幸运的是,抓取结果应该包含您需要的一切。但彩色图像还存在另一个可能的问题,相机可能会产生一些奇怪的色彩空间的图像,甚至可能没有去马赛克。因此您可能需要将其转换为常规 8 位 RGB。
执行此操作的代码应类似于:
var bitmap = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format24bppRgb).
var bitmapData = bitmap.LockBits(
new Rectangle(0, 0, target.Width, target.Height),
ImageLockMode.ReadWrite,
bitmap.PixelFormat);
try
{
var converter = new PixelDataConverter()
{
OutputPixelFormat = PixelType.BGR8packed
};
converter.Convert(
bitmapData.Scan0,
bitmapData.Stride * bitmapData.Height * 3,
grabResult.PixelDataPointer,
grabResult.PayloadSize,
grabResult.PixelTypeValue,
grabResult.Width,
grabResult.Height,
grabResult.PaddingX,
grabResult.Orientation
);
}
finally
{
target.UnlockBits(bitmapData);
}
要格外注意“步幅”。这是每行像素上的字节数。由于对齐要求,这可能大于像素数乘以每个像素的字节数。 Pylon 显然使用“填充”来描述这些额外字节数。我希望转换器采取目标步幅或填充,但我看不到任何此类参数。
另请注意,由于 字节顺序 问题,Format24bppRgb 和 pylons BGR8packed 意味着相同的事情。不幸的是,这令人困惑。
为了方便起见,图书馆还可能提供一些
.ToBitmap()
转换方法。我没有详细研究文档,无论如何我们都使用原始像素数据。
查看 pylon SDK C# 示例 -
PylonLiveView/MainForm.cs
此代码示例使用辅助类 PixelDataConverter 以及 C# 的 Bitmap 类,允许用户从多种输入相机像素格式进行转换。