dotnet 在 Windows 系统上使用 stakx 的 WIC 库

windows 系统上,windows imaging component(wic)是一个关键的多媒体处理组件,尤其是在处理图片编码、解码和处理方面。wpf(windows presentation foundation)已经很好地封装了 wic 层,使得在 wpf 中使用这些功能变得非常方便。然而,如果你有特殊需求,需要在 wpf 之外通过纯控制台的方式使用 wic 层的逻辑,可以考虑使用 stakx 的 wic 库。但经过探索,发现 wpf 框架仍然是使用 wic 层的最佳封装,即使在控制台应用程序中也可以使用 wpf。

因为我正在探索 WIC 层的各种方法,本文旨在记录一个可用的库,但最终发现 WPF 是最好的封装。无论是否使用 WPF 窗口,只要在 Windows 下,都可以使用 WPF 提供的 WIC 层封装,因为如果你只使用 WIC 层,相当于只是使用 WPF 库封装的方法。

关于 WPF 中封装的底层原理,可以参考 dotnet 读 WPF 源代码笔记,其中 WIC 多媒体图片处理功能是通过 WindowsCodecs.dll 实现的。

在 .NET Framework 中,引用 WPF 不会增加任何额外的输出文件。在 .NET Core 中,除非是独立发布,否则也不会有额外的输出文件。如果是框架依赖发布,额外输出的文件也非常少。因此,使用 WPF 框架几乎没有缺点。与 WPF 框架相比,使用 stakx 的 WIC 库并没有明显的优势。

接下来是关于如何使用 stakx 的 WIC 库的说明。在开始之前,需要通过 NuGet 安装 stakx.WIC 库,这是一个在 GitHub 上完全开源的库,请访问 https://www.php.cn/link/13287c195ee2950c927824118a3a42b3。

或者在你的 csproj 文件中添加以下代码:

  

这个库的入口是 WICImagingFactory 接口,这是一个 COM 定义的接口,因此可以使用 new 关键字创建,如下面的代码所示:

WICImagingFactory factory = new WICImagingFactory();

接口可以使用 new 关键字创建,只要标记了这是 COM 接口即可。

这个库的封装都在 WICImagingFactory 的方法中,各个方法的使用方法请参阅官方 WIC 文档。

以下是一些使用示例:

例如,获取本机安装的图片解码器,可以用来判断本机是否有 HEIF 解码器:

static void Main(string[] args){    WICImagingFactory factory = new WICImagingFactory();    foreach (var wicBitmapEncoderInfo in EnumEncoders(factory))    {        Console.WriteLine(wicBitmapEncoderInfo.GetFriendlyName());    }    // BMP Encoder    // GIF Encoder    // JPEG Encoder    // PNG Encoder    // TIFF Encoder    // WMPhoto Encoder    // DDS Encoder    // Microsoft HEIF Encoder}static IEnumerable EnumEncoders(IWICImagingFactory wic){    return wic.CreateComponentEnumerator(WICComponentType.WICEncoder, WICComponentEnumerateOptions.WICComponentEnumerateDefault)        .AsEnumerable()        .OfType();}

dotnet 在 Windows 系统上使用 stakx 的 WIC 库

以上就是dotnet 在 Windows 系统上使用 stakx 的 WIC 库的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/190612.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月1日 12:54:27
下一篇 2025年11月1日 13:00:12

相关推荐

  • React开发者如何高效掌握CSS:实用策略与Tailwind CSS入门

    本文旨在为在React开发中遭遇CSS学习瓶颈的开发者提供解决方案。建议在不阻碍React学习进度的前提下,优先考虑采用如Tailwind CSS等实用型原子化CSS框架。这种方法能显著简化样式开发流程,提升开发效率,让开发者更快地构建用户界面,同时逐步加深对CSS核心概念的理解,避免因CSS的复杂…

    2025年12月21日
    000
  • 使用Canvas实现一个简单的画板_javascript图形学

    答案:使用HTML5 Canvas和JavaScript实现画板,通过鼠标事件绘制线条。创建canvas元素,监听mousedown、mousemove和mouseup事件,利用ctx.beginPath()、moveTo()、lineTo()和stroke()绘图,添加颜色与线宽控制输入框及清空按…

    2025年12月21日
    000
  • 在Three.js中创建高性能辉光效果:UnrealBloomPass实现指南

    本文将指导您如何在three.js中高效地为3d对象添加逼真的辉光效果。传统的使用大量光源的方法会导致性能瓶颈,而通过引入后处理技术,特别是effectcomposer和unrealbloompass,我们能够以更优化的方式实现明亮、可定制的辉光,显著提升渲染性能和视觉质量,同时保持流畅的交互体验。…

    2025年12月21日
    000
  • Svelte/Vite多组件在Webflow中变量冲突的解决方案与最佳实践

    本文旨在解决在webflow等页面中嵌入多个由svelte和vite构建的javascript脚本时遇到的全局变量冲突问题。通过深入分析默认构建机制导致冲突的原因,文章提供了两种核心解决方案:利用es模块的隔离特性(`type=”module”`)或配置vite的库模式输出u…

    2025年12月21日
    000
  • 解决Svelte+Vite多组件部署中的全局变量冲突问题

    本文旨在解决将多个svelte组件通过vite构建为独立js文件,并在同一页面加载时遇到的全局变量冲突问题。核心解决方案包括两种方法:一是利用` 理解问题:为何会出现全局变量冲突? 当您使用Vite和Svelte构建多个独立的JavaScript文件,并将它们全部引入到同一个HTML页面时,可能会遇…

    2025年12月21日
    000
  • 手写一个符合Promises/A+规范的Promise_javascript进阶

    答案:文章实现了一个符合Promises/A+规范的简易Promise,包含三种状态(pending、fulfilled、rejected)、构造函数、then方法链式调用、resolvePromise解析逻辑及静态resolve/reject方法,通过queueMicrotask处理异步回调,支持…

    2025年12月21日
    000
  • 在 Cypress 测试中创建和重用对象数据

    在 cypress 测试中,直接在异步回调函数外部访问变量常导致 ‘未定义’ 错误。本文将详细讲解如何利用 cypress 的别名(alias)机制,从服务器响应中捕获并封装复杂数据对象。通过 `cy.wrap().as()` 创建别名,再使用 `cy.get().then(…

    2025年12月21日
    000
  • React组件命名约定:文件与组件名称的最佳实践

    本文深入探讨React组件的命名约定,重点区分了组件文件命名与组件本身命名的大小写规则。明确指出,虽然组件文件命名没有强制规定,但自定义React组件名称必须以大写字母开头,以避免与标准HTML元素混淆,确保JSX正确解析和渲染。 在React开发中,开发者经常会注意到组件文件和组件本身的命名似乎遵…

    2025年12月21日
    000
  • 正确配置与使用 Express Session 的教程

    本教程旨在详细指导如何在 Express 应用中正确配置和使用 `express-session` 中间件。文章将重点阐述 `express-session` 的正确集成方式,避免常见的配置错误,并深入探讨 Node.js 模块的本地与全局安装差异及其对项目依赖管理的影响,确保会话功能能够稳定可靠地…

    2025年12月21日
    000
  • Cypress测试中高效管理与复用数据:深入理解别名(Aliases)

    在cypress测试中,如何在异步操作(如api响应处理)中创建并有效复用数据对象是一个常见挑战。本文将深入探讨cypress的别名(aliases)机制,演示如何利用cy.wrap()和.as()将复杂数据结构安全地存储为别名,并在测试的不同阶段通过cy.get()进行检索和使用,从而解决变量作用…

    2025年12月21日
    000
  • 如何创建一个分页组件插件_JavaScript分页插件开发与功能实现教程

    答案:开发一个轻量级JavaScript分页插件,通过封装分页逻辑实现可复用性。首先设计包含container、total、pageSize、currentPage、maxVisiblePages和callback等参数的配置结构,计算总页数并生成DOM;核心逻辑包括根据当前页动态计算显示页码范围,…

    2025年12月21日
    000
  • 使用JavaScript实现一个简单的路由_js SPA

    单页应用通过JavaScript路由实现视图切换,利用hash变化监听动态更新内容,支持静态路径映射与动态参数匹配,提升用户体验且无需服务端配合,适用于小型项目。 单页应用(SPA)通过动态更新页面内容,避免整页刷新,提升用户体验。JavaScript 路由是实现 SPA 的核心机制之一。下面介绍如…

    2025年12月21日
    000
  • Js如何存储执行上下文

    JavaScript通过执行上下文栈管理代码执行,首先创建全局上下文并压入栈底;每当调用函数时,会创建新的函数执行上下文并压入栈顶,执行完毕后出栈,控制权交还上层上下文。每个执行上下文包含词法环境、变量环境和this绑定三部分,其中词法环境处理let/const声明及作用域链,变量环境处理var声明…

    好文分享 2025年12月21日
    000
  • React中异步操作与状态管理的最佳实践:useEffect在认证路由中的应用

    本文深入探讨了react中`usestate`异步更新的特性,以及在处理异步数据获取(如用户认证)时,如何正确使用`useeffect`钩子。通过一个私有路由组件的实例,文章详细阐述了将异步逻辑封装在`useeffect`中、处理竞态条件、以及管理加载状态的最佳实践,旨在帮助开发者构建更健壮、响应更…

    2025年12月21日
    000
  • JavaScript中的代码分割与动态导入

    代码分割是一种通过打包工具将大文件拆分为小块的构建策略,结合动态导入实现按需加载。常见方式包括入口点分割、公共依赖提取和路由级分割,其中动态导入使用 import() 语法异步加载模块,支持条件加载与错误处理。在 React 中可配合 React.lazy 和 Suspense 实现路由懒加载,通过…

    2025年12月21日
    000
  • Coloris.js:实现页面加载时自动打开颜色选择器

    本文详细介绍了如何使用coloris.js库,在网页加载时自动打开颜色选择器。核心方法是结合`inline: true`配置选项与正确的css容器定位(`position: relative`或`absolute`),并指定`parent`容器。通过此教程,您将学会如何设置html结构、css样式以…

    2025年12月21日
    000
  • 解决Svelte/Vite应用在Webflow中多脚本变量冲突的策略

    当多个svelte/vite构建的javascript文件作为普通脚本在同一webflow页面加载时,由于顶级作用域变量冲突,常导致`identifier ‘x’ has already been declared`错误。本文将详细探讨此问题,并提供两种有效的解决方案:利用h…

    2025年12月21日
    000
  • 深入理解React组件命名:文件与组件标识符的约定与规则

    本文旨在澄清react组件命名中的常见困惑,特别是文件命名与组件标识符的区分。核心要点是:react组件的标识符(在jsx中使用的名称)必须以大写字母开头,以便与标准html元素区分;而组件文件的命名则没有强制性规则,通常遵循项目或团队的约定,但推荐采用与组件标识符一致的pascalcase以增强可…

    2025年12月21日
    000
  • WebRTC连接建立的时序敏感性:ICE与手动信令的挑战

    webrtc连接在手动交换offer/answer时,如果answer未在短时间内被接受,连接可能因ice超时而失败。这主要是因为webrtc的交互式连接建立(ice)机制会持续消耗资源并探测网络路径,长时间的等待会导致资源浪费和状态失效。优化方案包括采用实时、自动化的信令机制,并合理配置ice参数…

    2025年12月21日
    000
  • js中co模块的介绍

    co模块用于自动执行Generator函数,支持Promise、thunk、数组和对象的异步处理,提升代码可读性,其设计思想催生了async/await,现多被原生语法取代。 co 模块是 JavaScript 中用于处理异步操作的一个小而强大的工具库,由 TJ Holowaychuk 开发。它主要…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信