我正在尝试使用 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 之间进行转换。
您尝试加载的图像文件显然是 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];
}