C#使用BmpBitmapDecoder读取BMP文件时遭遇编解码器流/URI异常
解决BmpBitmapDecoder读取BMP文件时的"codec cannot use the type of stream/URI provided"异常
问题分析
- 文件实际格式不符:不少文件扩展名标为
.bmp,但实际是PNG/JPG等其他格式,这会导致BmpBitmapDecoder无法识别,也能解释你用BitmapDecoder.Create时拿到PngBitmapDecoder的情况。 - URI格式不符合要求:BmpBitmapDecoder对URI格式有特定要求,直接用本地路径转Uri可能不满足解码器的预期。
- 流读取位置异常:如果流的读取位置不是从文件开头开始,解码器无法正确解析文件头信息。
解决方案
1. 先确认文件是真正的BMP格式
打开文件查看开头字节,BMP文件前两个字节是BM(十六进制为42 4D),如果不是,说明文件实际是其他格式,要么改用对应解码器,要么将文件转换为真正的BMP格式。
2. 修正URI的使用方式
创建URI时指定绝对路径类型,或者显式添加file://前缀:
var myPath = @"C:\MyImages\"; var imagesInDir = Directory.GetFiles(myPath, "*.bmp", SearchOption.TopDirectoryOnly).ToList(); // 方式1:指定UriKind.Absolute Uri imgURI = new Uri(imagesInDir[0], UriKind.Absolute); // 方式2:显式添加file://前缀(适配Windows路径斜杠) // Uri imgURI = new Uri($"file:///{imagesInDir[0].Replace("\\", "/")}"); BmpBitmapDecoder bmpImgDec = new BmpBitmapDecoder(imgURI, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapSource bmpSource = bmpImgDec.Frames[0];
3. 确保流从文件头开始读取
即使刚打开的流默认Position是0,也可以显式重置位置,避免意外情况:
var myPath = @"C:\MyImages\"; var imagesInDir = Directory.GetFiles(myPath, "*.bmp", SearchOption.TopDirectoryOnly).ToList(); using (var imgFS = new FileStream(imagesInDir[0], FileMode.Open, FileAccess.Read, FileShare.Read)) { imgFS.Position = 0; // 强制从文件头开始读取 BmpBitmapDecoder bmpImgDec = new BmpBitmapDecoder(imgFS, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapSource bmpSource = bmpImgDec.Frames[0]; // 在此处使用bmpSource,不要在using块外使用(流会被释放) }
4. 通用读取方式(无需指定解码器类型)
如果不确定文件格式,或者不想纠结解码器类型转换问题,直接用BitmapDecoder.Create方法自动匹配解码器:
var myPath = @"C:\MyImages\"; var imagesInDir = Directory.GetFiles(myPath, "*.bmp", SearchOption.TopDirectoryOnly).ToList(); using (var imgFS = new FileStream(imagesInDir[0], FileMode.Open, FileAccess.Read, FileShare.Read)) { BitmapDecoder decoder = BitmapDecoder.Create(imgFS, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapSource bmpSource = decoder.Frames[0]; // 使用bmpSource }
内容的提问来源于stack exchange,提问作者mericgeren
相关产品推荐
相关产品推荐

