在 Windows 系统上,有一个很重要的概念是 Windows Imaging Component 也就是 WIC 层,这是专门用来处理多媒体相关的系统组件,特别是用来处理图片相关,包括编码和解码和处理图片。开发者可以扩展 WIC 层的编解码器,从而让系统可以支持更多格式的多媒体文件。本文将告诉大家如何获取当前系统上在 WIC 层安装的图片编解码器,从而了解当前系统支持哪些格式的图片

为了方便在 dotnet 调用到 WIC 层,本文将安装 stakx 库。这个库是对 WIC 的底层基础封装,代码也不多,大家如果不想安装库,也可以自行去抄代码。详细请看 dotnet 在 Windows 系统上使用 stakx 的 WIC 库

新建 dotnet 6 控制台项目,编辑 csproj 项目文件,替换为如下代码即可完成 stakx 库的安装

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup> <ItemGroup>
<PackageReference Include="stakx.WIC" Version="0.1.0" />
</ItemGroup>
</Project>

按照 dotnet 在 Windows 系统上使用 stakx 的 WIC 库 博客提供的方法,先创建 WICImagingFactory 对象,代码如下

        WICImagingFactory factory = new WICImagingFactory();

接着通过 CreateComponentEnumerator 获取当前系统的编码器或解码器,如以下代码传入 WICComponentType.WICDecoder 即可获取解码器

   var componentEnumerator = factory.CreateComponentEnumerator(WICComponentType.WICDecoder, WICComponentEnumerateOptions.WICComponentEnumerateDefault);

componentEnumerator 是一个枚举,可以通过 AsEnumerable 方法转换为 .NET 的枚举,代码如下

        foreach (var o in componentEnumerator.AsEnumerable())
{
IWICBitmapCodecInfo codecInfo = o as IWICBitmapCodecInfo;
if (codecInfo != null)
{
Console.WriteLine("----------");
Console.WriteLine($"CLSID: {codecInfo.GetCLSID()}");
Console.WriteLine(codecInfo.GetFriendlyName());
Console.WriteLine($"FileExtensions: {string.Join(";", codecInfo.GetFileExtensions())}");
Console.WriteLine($"MimeType: {string.Join(";", codecInfo.GetMimeTypes())}");
Console.WriteLine($"Version: {codecInfo.GetVersion()}");
Console.WriteLine("----------");
}
}

这就是使用 C# 代码枚举本机所安装的图片解码器的方法

运行代码,输出大概如下

----------
CLSID: 6b462062-7cbf-400d-9fdb-813dd10f2778
BMP Decoder
FileExtensions: .bmp;.dib;.rle
MimeType: image/bmp
Version: 1.0.0.0
----------
----------
CLSID: 381dda3c-9ce9-4834-a23e-1f98f8fc52be
GIF Decoder
FileExtensions: .gif
MimeType: image/gif
Version: 1.0.0.0
----------
----------
CLSID: c61bfcdf-2e0f-4aad-a8d7-e06bafebcdfe
ICO Decoder
FileExtensions: .ico;.icon
MimeType: image/ico;image/x-icon
Version: 1.0.0.0
----------
----------
CLSID: 22696b76-881b-48d7-88f0-dc6111ff9f0b
CUR Decoder
FileExtensions: .cur
MimeType:
Version: 1.0.0.0
----------
----------
CLSID: 9456a480-e88b-43ea-9e73-0b2d9b71b1ca
JPEG Decoder
FileExtensions: .jpeg;.jpe;.jpg;.jfif;.exif
MimeType: image/jpeg;image/jpe;image/jpg
Version: 1.0.0.0
----------
----------
CLSID: 389ea17b-5078-4cde-b6ef-25c15175c751
PNG Decoder
FileExtensions: .png
MimeType: image/png
Version: 1.0.0.0
----------
----------
CLSID: b54e85d9-fe23-499f-8b88-6acea713752b
TIFF Decoder
FileExtensions: .tiff;.tif
MimeType: image/tiff;image/tif
Version: 1.0.0.0
----------
----------
CLSID: 981d9411-909e-42a7-8f5d-a747ff052edb
DNG Decoder
FileExtensions: .dng
MimeType: image/DNG
Version: 1.0.0.0
----------
----------
CLSID: a26cec36-234c-4950-ae16-e34aace71d0d
WMPhoto Decoder
FileExtensions: .wdp;.jxr
MimeType: image/vnd.ms-photo
Version: 1.0.0.0
----------
----------
CLSID: 9053699f-a341-429d-9e90-ee437cf80c73
DDS Decoder
FileExtensions: .dds
MimeType: image/vnd.ms-dds
Version: 1.0.0.0
----------
----------
CLSID: e9a4a80a-44fe-4de4-8971-7150b10a5199
Microsoft HEIF Decoder
FileExtensions: .heic;.heif;.hif;.avci;.heics;.heifs;.avcs;.avif;.avifs
MimeType: image/heic;image/heif;image/avci;image/heic-sequence;image/heif-sequence;image/avcs;image/avif;image/avif-sequence
Version: 1.0.0.0
----------
----------
CLSID: 7693e886-51c9-4070-8419-9f70738ec8fa
Microsoft Webp Decoder
FileExtensions: .webp
MimeType: image/webp
Version: 1.0.0.0
----------
----------
CLSID: 41945702-8302-44a6-9445-ac98e8afa086
Microsoft Raw Image Decoder
FileExtensions: .3FR;.ARI;.ARW;.BAY;.CAP;.CR2;.CR3;.CRW;.DCS;.DCR;.DRF;.EIP;.ERF;.FFF;.IIQ;.K25;.KDC;.MEF;.MOS;.MRW;.NEF;.NRW;.ORF;.ORI;.PEF;.PTX;.PXN;.RAF;.RAW;.RW2;.RWL;.SR2;.SRF;.SRW;.X3F;.DNG
MimeType: image/3FR;image/ARI;image/ARW;image/BAY;image/CAP;image/CR2;image/CR3;image/CRW;image/DCS;image/DCR;image/DRF;image/EIP;image/ERF;image/FFF;image/IIQ;image/K25;image/KDC;image/MEF;image/MOS;image/MRW;image/NEF;image/NRW;image/ORF;image/ORI;image/PEF;image/PTX;image/PXN;image/RAF;image/RAW;image/RW2;image/RWL;image/SR2;image/SRF;image/SRW;image/X3F;image/DNG
Version: 10.0.22621.1
----------
----------
CLSID: fc6ceece-aef5-4a23-96ec-5984ffb486d9
Microsoft JPEG-XL Decoder
FileExtensions: .JXL
MimeType: image/JXL
Version: 10.0.22621.1
----------

同理的获取解码器可以传入 WICComponentType.WICEncoder 代码,修改之后的代码如下

        var componentEnumerator = factory.CreateComponentEnumerator(WICComponentType.WICEncoder, WICComponentEnumerateOptions.WICComponentEnumerateDefault);

运行代码可以看到输出大概如下

----------
CLSID: 69be8bb4-d66d-47c8-865a-ed1589433782
BMP Encoder
FileExtensions: .bmp;.dib;.rle
MimeType: image/bmp
Version: 1.0.0.0
----------
----------
CLSID: 114f5598-0b22-40a0-86a1-c83ea495adbd
GIF Encoder
FileExtensions: .gif
MimeType: image/gif
Version: 1.0.0.0
----------
----------
CLSID: 1a34f5c1-4a5a-46dc-b644-1f4567e7a676
JPEG Encoder
FileExtensions: .jpeg;.jpe;.jpg;.jfif;.exif
MimeType: image/jpeg;image/jpe;image/jpg
Version: 1.0.0.0
----------
----------
CLSID: 27949969-876a-41d7-9447-568f6a35a4dc
PNG Encoder
FileExtensions: .png
MimeType: image/png
Version: 1.0.0.0
----------
----------
CLSID: 0131be10-2001-4c5f-a9b0-cc88fab64ce8
TIFF Encoder
FileExtensions: .tiff;.tif
MimeType: image/tiff;image/tif
Version: 1.0.0.0
----------
----------
CLSID: ac4ce3cb-e1c1-44cd-8215-5a1665509ec2
WMPhoto Encoder
FileExtensions: .wdp;.jxr
MimeType: image/vnd.ms-photo
Version: 1.0.0.0
----------
----------
CLSID: a61dde94-66ce-4ac1-881b-71680588895e
DDS Encoder
FileExtensions: .dds
MimeType: image/vnd.ms-dds
Version: 1.0.0.0
----------
----------
CLSID: 0dbecec1-9eb3-4860-9c6f-ddbe86634575
Microsoft HEIF Encoder
FileExtensions: .heic;.heif;.hif
MimeType: image/heic;image/heif
Version: 1.0.0.0
----------
----------
CLSID: 0e4ecd3b-1ba6-4636-8198-56c73040964a
Microsoft JPEG-XL Encoder
FileExtensions: .JXL
MimeType: image/JXL
Version: 10.0.22621.1
----------

如果同时需要获取编码器和解码器,可以传入 WICComponentType.WICEncoder | WICComponentType.WICDecoder 如以下代码

        var componentEnumerator = factory.CreateComponentEnumerator(WICComponentType.WICEncoder | WICComponentType.WICDecoder, WICComponentEnumerateOptions.WICComponentEnumerateDefault);

本文的代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 4cb2d3c557122601447d5b4a1e58587650535bb7

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 4cb2d3c557122601447d5b4a1e58587650535bb7

获取代码之后,进入 JegejarleRajurnayhajaidee 文件夹

dotnet win32 使用 WIC 获取系统编解码器的更多相关文章

  1. VC++编程中获取系统时间

    <span style="white-space:pre"> </span>总结了在程序中如何获得系统时间的方法 void CGetSystenTimeDl ...

  2. 【转】cocos2d-x获取系统时间——2013-08-25 10

    欢迎转载,本帖地址:http://blog.csdn.net/jinjian2009/article/details/9449585 之前使用过cocos2d-x获取系统时间,毫秒级的 long ge ...

  3. cocos2d-x获取系统时间

    欢迎转载,本帖地址:http://blog.csdn.net/jinjian2009/article/details/9449585 之前使用过cocos2d-x获取系统时间,毫秒级的 long ge ...

  4. C# 获取系统Icon、获取文件相关的Icon

    原文:C# 获取系统Icon.获取文件相关的Icon 1.获取系统Icon工具下载SystemIcon.exe using System; using System.Collections.Gener ...

  5. C# API 获取系统DPI缩放倍数跟分辨率大小

    原文:C# API 获取系统DPI缩放倍数跟分辨率大小 using System; using System.Drawing; using System.Runtime.InteropServices ...

  6. WPF 获取系统 DPI 的多种方法

    原文:WPF 获取系统 DPI 的多种方法 WPF 获取系统 DPI 的多种方法 由于 WPF 的尺寸单位和系统的 DPI 相关,我们有时需要获取 DPI 值来进行一些界面布局的调整,本文汇总了一些 ...

  7. windows代码获取系统硬件信息的两种方式

    欢迎访问我的个人博客:xie-kang.com 原文地址 目前windows有两种方式获取系统硬件信息: 1)通过GetSystemFirmwareTable API获取SMBIOS信息,一段含丰富信 ...

  8. ThinPHP命名空间,连接数据库是要修改的配置文件,Model数据模型层,跨控制器调用,如何获取系统常量信息,

    一.命名空间(主要是为了实现自动加载类) *命名空间(相当于虚拟的目录),为了让类有一个统一的文件夹来管理(可以自动加载'类'),每个文件都要有命名空间*tp如何做命名空间:*TP框架下有一个初始命名 ...

  9. Delphi编程获取系统当前进程、窗口句柄、文件属性以(转)

    Delphi编程获取系统当前进程.窗口句柄.文件属性以及程序运行状态. uses TLHelp32,PsAPI; (1)显示进程列表:procedure TForm1.Button2Click(Sen ...

  10. android 获取系统联系人 完全解析

    一.代码 1.ContactsEngine.java import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...

随机推荐

  1. 05.java多线程问题

    目录介绍 5.0.0.1 线程池具有什么优点和缺点?为什么说开启大量的线程,会降低程序的性能,那么该如何做才能降低性能? 5.0.0.3 线程中start和run方法有什么区别?wait和sleep方 ...

  2. 记录--整会promise这8个高级用法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 发现很多人还只会promise常规用法 在js项目中,promise的使用应该是必不可少的,但我发现在同事和面试者中,很多中级或以上的前端 ...

  3. [.NET项目实战] Elsa开源工作流组件应用(三):实战演练

    补充 之前的文章简单介绍了工作流和Elsa工作流库,这里再补充说明两点 工作流的使用场景非常广泛,几乎涵盖了所有需要进行业务流程自动化管理的领域. 学习一个开源库,最简单的方法就是看源码,Elsa的工 ...

  4. WC-Write Combining 合并写技术

    WC-Write Combining 合并写技术 为了提高写效率: CPU在写入L1时,同时用WC写入L2 实验代码: public class WriteCombining { private st ...

  5. 运行xxl-job,整合xxl-job至jeecg-boot项目

    1.前言:xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 源码仓库地址:https://gitee.co ...

  6. #珂朵莉树#CF896C Willem, Chtholly and Seniorious

    题目 支持区间加,区间推平,询问区间第\(k\)小, 以及询问区间\(\sum{a_i^x}\pmod y\),数据随机 分析 由于数据随机,那么区间推平的概率为\(\frac{1}{4}\), 考虑 ...

  7. #莫比乌斯函数,Miller-Rabin#洛谷 3653 小清新数学题

    题目 求\(\sum_{i=l}^r\mu(i),r-l\leq 10^5,1\leq l\leq r\leq 10^{18}\) 分析 其实有一道可以算是弱化版的题目 这种类型的tricks就是枚举 ...

  8. Bootstrap实战 - 评论列表

    一.介绍 社交媒体网站盛行,人们常常会使用评论表达自己的观点,评论功能已然成为网站的一部分. 二.知识点 2.1 媒体对象 官方解释:这是一个抽象的样式,用以构建不同类型的组件,这些组件都具有在文本内 ...

  9. 看你能解锁哪些新身份?OpenHarmony大使、MVP、金码达人在线申报

  10. 使用 OpenCV 进行文档矫正

    使用 OpenCV 进行文档矫正 本文只发布于博客园与pchar博客 std::vector<std::vector<cv::Point>> cvhelper::findCor ...