代码之家  ›  专栏  ›  技术社区  ›  ToolmakerSteve

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

  •  0
  • ToolmakerSteve  · 技术社区  · 7 年前

    这是实现实际目标的一步 ,以更新旧版 Windows窗体 应用程序,运行于 .NET Framework 3.5

    How initialize Direct2D renderer into GDI context from managed code for older version of .NET Framework 对于本项目的开始。

    我正在关注这个 文件: 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 ,它是指在中定义的COM接口 WIC公司


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


    Win2D 不是一个选择,阿法克。WPF解决方案也可能没有帮助,因为它是一个32位的应用程序,并且没有多少内存;我不太愿意再添加一项技术。)


    夏普DX

    所以我试图从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("$1")</const>
    


    我不明白那是什么 Mapping.XML 正在做。我想手动编码这个COM接口引用。并知道如何根据需要对其他WIC接口进行编码。或者了解如何生成此类接口,而无需构建所有SharpDX。

    1 回复  |  直到 7 年前
        1
  •  0
  •   ToolmakerSteve    7 年前

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

    包含对WIC的C#访问(通过COM互操作)。