如何从 C# 创建 WIC ImageFactory(COM 对象)?

How create WIC ImageFactory (a COM object) from C#?

这是实现实际目标的第一步,即将 Direct2D 与托管代码中的 GDI 混合,以更新遗留 Windows 表单 应用程序,运行s 在 .NET Framework 3.5 上(目前迁移到较新的 .NET 不切实际)。

有关此项目的开头,请参阅

我正在关注这个 C++ 文档:Direct2D/Programming Guide/How-to/How to Load a Bitmap from a File

特别是这个 C++:

HRESULT DemoApp::LoadBitmapFromFile(
    ID2D1RenderTarget *pRenderTarget,
    IWICImagingFactory *pIWICFactory,
    PCWSTR uri,
    UINT destinationWidth,
    UINT destinationHeight,
    ID2D1Bitmap **ppBitmap
    )
{
    IWICBitmapDecoder *pDecoder = NULL;
    IWICBitmapFrameDecode *pSource = NULL;
    IWICStream *pStream = NULL;
    IWICFormatConverter *pConverter = NULL;
    IWICBitmapScaler *pScaler = NULL;

    HRESULT hr = pIWICFactory->CreateDecoderFromFilename(
        uri,
        NULL,
        GENERIC_READ,
        WICDecodeMetadataCacheOnLoad,
        &pDecoder
        );

需要IWICImagingFactory pIWICFactory,它指的是在WIC(Windows Imaging Component)中定义的COM接口。


我的问题: 如何从 C# 中引用 IWICImagingFactory COM 对象?

或者是否有其他方法可以将位图导入 Direct2D?
(必须在 .NET 3.5 上 运行 并使用 WinForms,所以 Win2D 不是一个选项,AFAIK。WPF 解决方案也可能无济于事,因为它是一个 32 位应用程序,并且没有内存还剩很多;我犹豫是否要添加另一项技术。)


如果我们的应用程序是在 .NET Framework 4.0 中,那么这个任务会很容易完成,因为我们可以使用 SharpDX,它包括 Direct2D+WIC;不幸的是,直到 v.3.0.0(需要 .NET 4.0)才将 Direct2D 添加到 SharpDX。

所以我试图从 SharpDX 源中提取工厂创建代码。
文件 SharpDX.Direct2D1\WIC\ImagingFactory.cs:

using System;

namespace SharpDX.WIC
{
    public partial class ImagingFactory
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="ImagingFactory"/> class.
        /// </summary>
        public ImagingFactory()
        {
            Utilities.CreateComInstance(WICImagingFactoryClsid, Utilities.CLSCTX.ClsctxInprocServer, Utilities.GetGuidFromType(typeof(ImagingFactory)), this);
        }
    }
}

我已经成功复制并构建了该代码使用的所有文件,除了一个参考:
WICImagingFactoryClsid
这是在 Mapping.xml 文件中找到的:

<const from-guid="CLSID_WICImagingFactory" class="SharpDX.WIC.ImagingFactory" type="System.Guid" name="WICImagingFactoryClsid">new System.Guid("")</const>

我还没有尝试从源代码构建 SharpDX,以了解该文件如何生成可构建的 class 库;
我宁愿通过将最少需要的代码集成到我们的应用程序中来解决这个问题。

我不明白 Mapping.XML 在做什么。我想手动编码这个 COM 接口参考。并了解如何根据需要对其他 WIC 接口进行编码。或者了解如何在不构建所有 SharpDX 的情况下生成此类界面。

(基于 SimonMourier 的评论,因为他没有返回 post 他们作为答案。)

参见: https://github.com/saucecontrol/PhotoSauce/tree/master/src/MagicScaler/Interop

包含对 WIC 的 C# 访问(通过 COM Interop)。

(但是,这使用了不在 VS 2010 下构建的 C# 功能,因此我尚未对其进行测试。)