2017-09-21 74 views
0

这是一个步骤,在实际的目标,这是与GDI从托管代码混合的Direct2D,更新传统Windows窗体应用程序,即在.NET Framework 3.5的运行(迁移到新的.NET将不实用此时)。如何从C#创建WIC ImageFactory(一个COM对象)?

请参阅How initialize Direct2D renderer into GDI context from managed code for older version of .NET Framework该项目的开始。

我下面这个C++ DOC: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图像处理组件)中所定义的COM接口。


我的问题:如何 从C#参考IWICImagingFactory COM对象?

或者是否有一些替代方法可以将位图导入Direct2D?
(必须在.NET 3.5上运行,并且与WinForms一起工作,因此Win2D不是一种选择,AFAIK。WPF解决方案也可能不会提供帮助,因为它是32位应用程序,并且没有太多内存;我毫不犹豫地添加其他技术)


这个任务是很容易做到,如果我们的应用程序在.NET Framework 4.0中,因为我们可以再使用SharpDX,其中包括Direct2D的+ WIC。不幸的是,直到v3.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("$1")</const> 

我还没有尝试从源代码构建SharpDX,以了解该文件如何生成可构建的类库;
我宁愿通过将最低限度所需的代码集成到我们的应用程序来解决此问题。

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

+0

WIC是SDK的wincodec.idl和.h刚才定义的(从产生的.idl)文件。 .idl没有定义TLB,所以你不能使用.NET。恐怕你必须手动重新声明所有需要的接口和其他工件(我可以给你一些例子,但如果你不知道如何做,那么无论如何你都会遇到麻烦:-)。另一个解决方案是从wincodec.idl开始,调整它,使用MIDL构建一个TLB,并从.NET引用它,但它几乎很难做到。 –

+0

wincodec.cs和xml的东西在哪里? –

+0

好吧,我想你是在谈论这个:https://github.com/saucecontrol/PhotoSauce/tree/master/src/MagicScaler/Interop这可能是最简单的事情使用WIC的确很简单,比试图重建SharpDX极其简单有自己的做事方式(加上它需要不安全的环境,这可能会造成问题) –

回答