【转】【WPF】资源读取 URI

一开始看到WPF里面经常用如下语句来构造资源文件Uri:

Uri uri = new Uri("/AssemblyName;component/image.png");

我还以为这种格式的字符串是URI标准规定的,但是网上查了一下却没发现有这种格式的URI字符串。

URI是统一资源标识符,通用文法为:

协议名(http,https,ftp,file等)+冒号+协议所对应的内容

URI又分为URL和URN,URL是用来定义一个资源的访问路径.而URN则是用来定义一个资源的名称。(http://zh.wikipedia.org/zh/统一资源标志符)

仔细看了一下MSDN,才发现上面格式的字符串是微软件自己扩展出来的一种URI格式,即Pack URI.这种URI在WPF里用得非常多,主要用来定位

资源文件,以及Xaml文件等。

Pack URI主要是用于描述一个Package中所包含的组成单元。

1. Pack URI的主要文法

pack://authority/path

其中authority指这里所指的Package的类型,而path主要指这里所指的组成单元在Package中路径。

WPF所支持的authority包括:application:/// 和 siteoforigin:/// :

前者主要用来描述在编绎时就已知的资源(比如:资源文件等被Project所引用的文件在编绎时刻均已知),

而后者主要用来描述在编绎时无法确定其状态的外部资源(比如:硬盘上的某个文件,或者网格上的某个文件)。

注意:在实际构建Pack URI的时需要将authority中所包含的"/"换成",". 因此 application:/// 应该为 application:,,,,siteoforigin:///类推。

2. Pack URI的用法

  (1)表示当前Assembly中所引用的资源时,采用如下格式构建Pack URI

pack://application:,,,/(资源相对于Assembly所在目录的相对路径)

  (2)表示当前Assemby所引用的其它Assembly所引用的资源时,采用如下格式构建Pack URI

pack://application:,,,/AssemblyShortName[;Version][;PublicKey];component/(资源相对于Assembly所在目录的相对路径)

  (3)表示siteoforigin类型的资源时,采用如下格式构建Pack URI

pack://siteoforigin:,,,/(资源相对于当前执行的assembly所在位置的路径)

3. Absolute pack URI and relative pack URI

以上所说的都是Absolute pack URI,格式包含schema://authority/path.字符串比较长,写起来不是很方便。

因此还有一种简化版的relative pack URI,构造时只需要使用path即可。

注意:当表示当前Assembly中所引用的资源时,path需表示目标资源相对于当前路径的相对路径。在路径前加"/"表示相对于Assembly的根目录

原文地址:http://www.cnblogs.com/Code-life/archive/2012/10/08/2715930.html

<think>好的,我现在需要帮助用户在WPF读取多页TIFF图像的示例代码。用户之前已经询问过相关问题,我之前也给出了使用TiffBitmapDecoder的方法。现在用户再次提问,可能需要更详细的代码或进一步的解释。 首先,回顾之前的回答。我提到使用TiffBitmapDecoder来解码多页TIFF文件,遍历Frames集合来访问每一页。用户现在可能希望有更具体的代码示例,或者遇到了实现中的问题。 接下来,检查用户提供的引用。引用1关于控件的封装可能不直接相关,但用户可能希望确保图像加载到控件时保持交互性。引用2涉及图像处理,但用户的问题是读取多页TIFF,可能需要注意图像格式是否正确。引用3提到多线程,可能用户需要性能优化方面的建议,但当前问题更偏向基本实现。 用户明确想要读取多页TIFF的示例代码,因此应重点放在TiffBitmapDecoder的使用上。需要确认代码的正确性,比如Uri的路径是否正确,是否需要处理文件流,以及如何将每帧显示在UI上。 可能的疑问:用户是否遇到路径错误?是否需要异步加载以避免UI冻结?是否需要处理异常,比如文件不存在或格式不支持?是否需要展示多页切换的功能? 在示例代码中,可能需要详细展示如何将每帧绑定到Image控件,或者如何通过按钮切换页面。此外,注意事项部分应提醒用户检查图像格式、异常处理以及性能问题,尤其是大文件处理。 需要确保代码符合WPF的最佳实践,比如使用MVVM模式,或者直接在代码后台处理。如果用户需要更高级的功能,比如动态生成多页TIFF,可能需要引用之前的回答中的编码部分,但当前问题集中在读取而非生成。 最后,总结步骤:使用TiffBitmapDecoder加载文件,遍历Frames,将每帧显示在UI上。提供完整代码示例,并加入异常处理和性能提示。</think>在 WPF读取多页 TIFF 图像,可以通过 `TiffBitmapDecoder` 类实现。以下是完整的示例代码和分步说明: --- ### 完整示例代码 ```csharp using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; public partial class MainWindow : Window { private TiffBitmapDecoder _tiffDecoder; private int _currentPageIndex; public MainWindow() { InitializeComponent(); LoadMultiPageTiff(@"C:\path\to\multipage.tiff"); } // 加载多页 TIFF 文件 private void LoadMultiPageTiff(string filePath) { try { // 创建解码器 _tiffDecoder = new TiffBitmapDecoder( new Uri(filePath, UriKind.Absolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad); // 显示第一页 _currentPageIndex = 0; DisplayCurrentPage(); } catch (Exception ex) { MessageBox.Show($"加载失败: {ex.Message}"); } } // 显示当前页 private void DisplayCurrentPage() { if (_tiffDecoder?.Frames.Count > _currentPageIndex) { imgTiffDisplay.Source = _tiffDecoder.Frames[_currentPageIndex]; lblPageCount.Content = $"第 {_currentPageIndex + 1} 页 / 共 {_tiffDecoder.Frames.Count} 页"; } } // 上一页按钮点击事件 private void BtnPrevious_Click(object sender, RoutedEventArgs e) { if (_currentPageIndex > 0) { _currentPageIndex--; DisplayCurrentPage(); } } // 下一页按钮点击事件 private void BtnNext_Click(object sender, RoutedEventArgs e) { if (_currentPageIndex < _tiffDecoder.Frames.Count - 1) { _currentPageIndex++; DisplayCurrentPage(); } } } ``` #### 对应的 XAML 界面 ```xml <Window x:Class="WpfTiffExample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="多页 TIFF 查看器" Height="450" Width="600"> <Grid> <Image x:Name="imgTiffDisplay" Margin="10" Stretch="Uniform"/> <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Center"> <Button x:Name="btnPrevious" Content="上一页" Click="BtnPrevious_Click" Margin="5"/> <Label x:Name="lblPageCount" Content="页码" Margin="5"/> <Button x:Name="btnNext" Content="下一页" Click="BtnNext_Click" Margin="5"/> </StackPanel> </Grid> </Window> ``` --- ### 核心步骤说明 1. **解码 TIFF 文件** 通过 `TiffBitmapDecoder` 加载 TIFF 文件并解析多页数据: ```csharp _tiffDecoder = new TiffBitmapDecoder( new Uri(filePath, UriKind.Absolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad); ``` 2. **访问多页内容** 使用 `Frames` 集合获取所有页面: ```csharp foreach (var frame in _tiffDecoder.Frames) { ... } ``` 3. **显示分页逻辑** 通过 `_currentPageIndex` 控制当前显示页,配合按钮实现翻页功能。 --- ### 关键注意事项 1. **文件格式兼容性** WPF 原生支持未压缩或使用 LZW/PackBits 压缩的 TIFF 文件。若遇到其他压缩算法(如 JPEG-in-TIFF),需通过第三方库(如 [LibTiff.NET](https://bitmiracle.com/libtiff/))解析[^2]。 2. **性能优化** - 大型 TIFF 文件建议使用 `BitmapCacheOption.OnLoad` 提前加载,避免运行时延迟。 - 若需动态加载(如逐页加载),改用 `BitmapCacheOption.None` 并按需解码。 3. **异常处理** ```csharp try { /* 加载代码 */ } catch (FileNotFoundException) { /* 文件不存在 */ } catch (NotSupportedException) { /* 格式不支持 */ } ``` --- ### 扩展场景 若需将多页 TIFF 换为可编辑的位图集合: ```csharp List<BitmapSource> tiffPages = _tiffDecoder.Frames.ToList(); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值