C# - 读取 .bmp 文件时出现“编解码器无法使用提供的流类型”

问题描述 投票:0回答:1

我正在尝试使用 BMPBitMapDecoder 读取目录中的 .bmp 文件。但是,无论我尝试什么,我都会收到“编解码器无法使用提供的流/URI 类型”异常。

到目前为止我尝试过的事情:

1)遵循 Microsoft 使用 URI 的文档: 我按照 uri 示例编写了如下内容:

myPath = "C:\\MyImages\\";
imagesInDir = Directory.GetFiles(myPath, "*.bmp", SearchOption.TopDirectoryOnly).ToList();

Uri imgURI = new Uri(imagesInDir[0]);
BmpBitmapDecoder bmpImgDec = new BmpBitmapDecoder(imgURI, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bmpSource = bmpImgDec.Frames[0];

结果: 我收到“编解码器无法使用提供的 URI 类型”异常。

2)遵循微软使用文件流的文档:我遵循文件流示例并写了这样的内容:

myPath = "C:\\MyImages\\";
imagesInDir = Directory.GetFiles(myPath, "*.bmp", SearchOption.TopDirectoryOnly).ToList();

FileStream imgFS = new FileStream(imagesInDir[0], FileMode.Open, FileAccess.Read, FileShare.Read);
BmpBitmapDecoder bmpImgDec = new BmpBitmapDecoder(imgFS, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bmpSource = bmpImgDec.Frames[0];

结果: 我收到“编解码器无法使用提供的流类型”异常。

3)使用块来使用流:我写了这样的东西:

myPath = "C:\\MyImages\\";
imagesInDir = Directory.GetFiles(myPath, "*.bmp", SearchOption.TopDirectoryOnly).ToList();

using (Stream imgFS = new FileStream(imagesInDir[0], FileMode.Open, FileAccess.Read, FileShare.Read)){
    BmpBitmapDecoder bmpImgDec = new BmpBitmapDecoder(imgFS, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    BitmapSource bmpSource = bmpImgDec.Frames[0];
}

结果: 我收到“编解码器无法使用提供的流类型”异常。

4)使用 BitmapDecoder 而不是 BmpBitmapDecoder: 当我遵循 Microsoft 的文档和编写 using 块时,我都尝试过这样做。我没有使用 BmpBitMapDecoder 的构造函数,而是使用 BitmapDecoder 的 Create 方法。

结果: 这次,首先,它抱怨无法在 BmpBitMapDecoder 和 BitMapDecoder 之间隐式转换。所以我使用了类型转换:“(BmpBitmapDecoder)”。然而,当我添加转换时,它给了我另一个例外,即无法在 PngBitmapDecoder 和 BmpBitmapDecoder 之间进行转换。

c# wpf bitmap .net-7.0
1个回答
0
投票

您尝试加载的图像文件显然是 PNG 文件,尽管它们的文件扩展名。

但是,您应该编写不知道实际格式的代码。像这样使用 BitmapDecoder 类:

IEnumerable<string> imagesInDir = Directory.EnumerateFiles(
    myPath, "*.bmp", SearchOption.TopDirectoryOnly);

string firstImage = imagesInDir.FirstOrDefault();

if (firstImage != null)
{
    Uri imgURI = new Uri(firstImage);
    BitmapDecoder decoder = BitmapDecoder.Create(
        imgURI, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);

    BitmapSource bitmap = decoder.Frames[0];
}
© www.soinside.com 2019 - 2024. All rights reserved.