gpt4 book ai didi

c# - 使用 LockBits 从内存创建的 GDI+ 通用错误保存位图

转载 作者:太空狗 更新时间:2023-10-29 18:12:03 26 4
gpt4 key购买 nike

根据我在 SO 和网络上的研究,保存位图时的 GDI+ 一般错误显然是一个常见问题。给定以下简化片段:

byte[] bytes = new byte[2048 * 2048 * 2];

for (int i = 0; i < bytes.Length; i++)
{
// set random or constant pixel data, whatever you want
}

Bitmap bmp = new Bitmap(2048, 2048, PixelFormat.Format16bppGrayScale);
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, 2048, 2048), ImageLockMode.ReadWrite, bmp.PixelFormat);
System.Runtime.InteropServices.Marshal.Copy(bytes, 0, bmpData.Scan0, 8388608);
bmp.UnlockBits(bmpData);
bmp.Save(@"name.bmp");

这会导致 0x80004005 一般错误。据说通常的原因是组件锁定,但我在这里看不到任何东西。我只是瞎了吗?我保存的路径存在,当然,只创建了一个空的bmp文件(0B)。

背景:我正在使用 C++/CLI 包装器从相机驱动程序获取像素数据并将其传输到 .NET,因此上面的 Bitmap 对象由函数调用返回。但是既然这个小例子已经失败了,我想适配器没有问题。

非常感谢任何建议!

最佳答案

   Bitmap bmp = new Bitmap(2048, 2048, PixelFormat.Format16bppGrayScale);

GDI+ 异常相当差,您几乎没有希望诊断出这两个错误。较小的一个是您的 Save() 调用,它没有指定您要保存的 ImageFormat。默认为 PNG,而不是您希望的 BMP。

但最核心的是PixelFormat.Format16bppGrayScale。在设计 GDI+ 时,在 .NET 出现很久之前,每个人仍在使用 CRT 而不是 LCD 显示器。 CRT 非常擅长显示各种颜色。虽然不错,但还没有能够显示 65536 种不同灰色的主流 CRT。最重要的是受到视频适配器中 DAC 的限制,该芯片将数字像素值转换为 CRT 的模拟信号。可以在 100 MHz 或更高频率下以 16 位精度进行转换的 DAC 在技术上尚不可行。 Microsoft 押注于显示技术的改进,以便有一天能够实现这一目标,因此将 Format16bppGrayScale 指定为可能某天可用的像素格式。

那并没有发生。相反,LCD 在色彩分辨率方面明显更差。典型的 LCD 面板只能解析 6 位颜色,而不是像素格式中可用的 8 位。达到 16 位颜色分辨率需要重大的技术突破。

所以他们猜错了,因为像素格式没有用,GDI+ 实际上没有可以编写 16bpp 灰度图像格式的图像编码器。当您尝试将其保存到磁盘时,无论您选择何种 ImageFormat,Kaboom。

实际使用的是16bpp灰度,放射成像就是用那个像素格式。使用非常昂贵的显示器使其真正有用。然而,此类设备总是使用自定义图像格式,DICOM 是通常的选择。 GDI+ 没有编解码器。

您需要购买支持客户所需图像格式的库。 Lead Tools 是该产品领域中的千磅 gorilla 。

关于c# - 使用 LockBits 从内存创建的 GDI+ 通用错误保存位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19704021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com