在 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. 记录--h5端调用手机摄像头实现扫一扫功能

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.前言 最近有遇到一个需求,在h5浏览器中实现扫码功能,其本质便是打开手机摄像头定时拍照,特此做一个记录.主要技术栈采用的是vue2,使 ...

  2. 从零开始写 Docker(八)---实现 mydocker run -d 支持后台运行容器

    本文为从零开始写 Docker 系列第八篇,实现类似 docker run -d 的功能,使得容器能够后台运行. 完整代码见:https://github.com/lixd/mydocker 欢迎 S ...

  3. GO 协程【VS】C# 多线程【Go-C# Round 1】

    〇.前言 最近接触到 Go 语言相关的内容,由于之前都是用的 C# 语言,然后就萌生了对这两种语言进行多方面比较. 本文将在 Go 的优势项目协程,来与 C# 的多线程操作进行比较,看下差距有多大. ...

  4. JAVA 获取文件 MD5

    private static final char[] hexCode = "0123456789ABCDEF".toCharArray(); // 文件类取MD5 public ...

  5. Oracle 获取月初、月末时间,获取上一月月初、月末时间

    select trunc(sysdate, 'mm'), last_day(trunc(sysdate)), trunc(add_months(trunc(sysdate), -1), 'mm'), ...

  6. Impala 高性能、低延迟的大数据查询引擎

    Impala是什么? Impala提供对大数据更快速,交互式 SQL查询. Impala支持对存储在HDFS.HBase及S3等数据查询. Impala使用和Hive相同的元数据.SQL定义.ODBC ...

  7. 详解SSL证书系列(9)SSL客户端认证

    上一篇介绍了HTTPS和HTTP协议的区别,理解了HTTP加上加密处理和认证以及完整性保护后即是HTTPS,同时HTTPS也是身披SSL外壳的HTTP,那么SSL客户端认证是怎么回事呢?这篇文章我将带 ...

  8. 16 JavaScript逗号运算符

    16 JavaScript逗号运算符 Python 逗号运算符一般用于组合多个表达式,其返回值是最后一个表达式的值,例如: function s(){ console.log(1), console. ...

  9. Lambda表达式和闭包Closure

    目录 简介 JS中的闭包 java中的闭包 深入理解lambda表达式和函数的局部变量 总结 简介 我们通常讲到闭包,一般都是指在javascript的环境中.闭包是JS中一个非常重要的也非常常用的概 ...

  10. 报名启动|OpenHarmony源码转换器—多线程特性转换赛题