我有一些原始的传感器数据是在一个单维的字节数组。数据实际上是IEEE单精度浮点格式。我知道X轴和Y轴的边距,我想从我的数据创建Windows位图(灰度 - 只有一个包含亮度数据的颜色平面)。如何在C#中从头开始创建Windows位图?
这里就是我试图至今:
var bitmap = new Bitmap(xAxis, yAxis, PixelFormat.Format16bppGrayScale);
var pixelReader = GetPixelReader(hdu.MandatoryKeywords.BitsPerPixel);
using (var stream = new MemoryStream(hdu.RawData, writable: false))
{
using (var reader = new BinaryReader(stream, Encoding.ASCII))
{
for (var y = 0; y < yAxis; y++)
{
for (var x = 0; x < xAxis; x++)
{
var pixel = pixelReader(reader);
var argb = Color.FromArgb(pixel, pixel, pixel);
bitmap.SetPixel(x, y, argb);
}
}
}
}
return bitmap;
pixelReader是一个委托并定义为:
private static int ReadIeeeSinglePrecision(BinaryReader reader)
{
return (int) reader.ReadSingle();
}
当我运行这段代码,我上线那里得到一个异常InvalidArgumentException
我尝试设置像素值。我在调试器中加入了它,x = 0,y = 0,像素= 0。它没有说哪个参数是无效的或为什么(谢谢微软)。
很显然,我做错了事实上,我怀疑可能有更有效的方法来解决这个问题。我将不胜感激任何建议。由于我无法完全理解的原因,我发现这些代码非常具有挑战性。
不要使用'SetPixel'进行批量操作,[改用'LockBits'](http://stackoverflow.com/questions/1563038/fast-work-with-bitmaps-in-c-sharp)。此外,请[获取例外详情](https://blogs.msdn.microsoft.com/saraford/2008/08/07/did-you-know-you-can-copy-the-exception-details-with-一键从异常助手-276 /)的InvalidArgumentException并将其包括在这里。这将有助于大大发现问题所在。 –
@ScottChamberlain是的,我已经阅读过文档中的内容,但我认为这只是一个表现问题,不是吗?我需要先解决问题,然后再优化它,或者永远不要。说实话,LockBits的文档对我来说更不明智。 –
你在argb中获得一个有效的颜色还是只是得到一个null?我怀疑你的问题更早,但隐式类型变量模糊了这个问题。我强烈建议使用实际的类型,而不是将所有的代码都定义为变量,而这些代码中的大部分/全部都不需要。 – AgapwIesu