You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:18:17