【发布时间】:2020-11-12 00:53:23
【问题描述】:
我正在将旧的 .NET Framework 4 WinForms 应用程序转换为 .NET 5。在这种情况下,最简单的方法是重新创建项目,该项目大部分都有效。但是,我有一种方法可以从内存流中解码 JPG 图像:
// Look for JFIF header
MemoryStream memStream = new MemoryStream( rawData );
JpegBitmapDecoder decoder = new JpegBitmapDecoder( memStream,
BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default );
BitmapSource bmpSource = decoder.Frames[0];
Bitmap bitmap = new Bitmap( bmpSource.PixelWidth, bmpSource.PixelHeight,
PixelFormat.Format24bppRgb );
这失败了,因为 VS 2019 抱怨“使用 System.Windows.Media.Imaging”会导致错误,并且 JpegBitmapDecoder 显示为红色波浪线。如果我将鼠标悬停在 JpegBitmapDecoder 上,我可以选择“使用 System.Windows.Media.Imaging;来自 PresentationCode”。
但是,选择该选项会导致 VS 2019 卡在“执行建议的操作”上,尝试添加使用。
该项目针对 .NET 5,并且我添加了 Microsoft.Windows.Compatibility NuGet 包,那么我做错了什么?或者,如何访问 JpegBitmapDecoder?
【问题讨论】:
-
var bitmap = (Bitmap)Image.FromStream(new MemoryStream(rawData), true);。还是您有充分的理由在 WinForms 中使用 BitmapSource? -
这是来自 DICOM .dcm 文件的字节部分,可以是 JPG 或 BMP 格式。当时,拥有 2 种不同的方法(BMP 的简单方法和 JPG 专用的方法)似乎是解码它的唯一方法。你是说 Image.FromStream() 会正确处理这个,无论字节流是什么格式?
-
是的,它使用从源 Bitmap 标头派生的内部解码器生成一个 Bitmap(当然,如果支持 Image 格式)。如果你的 DICOM 是 16 位灰度图像,那当然不行。
-
顺便说一句,将此信息添加到问题中,它可能对其他人更有用。如果 GDI+ 不支持 DICOM 格式,这就是首先使用 BitmatSource 的原因,那么其他人可以找到此信息。
-
Jimi,DICOM 是文件格式,不是图像格式,所以不是 GDI+ 的问题。它确实包含可以采用各种格式的图像,这就是我遇到的地方。正如我在下面提到的,这是继承的代码。我应该解决这个问题,只使用 GDI+,现在使用 WPF。