通过结构将位图从C#传递到C ++

时间:2018-11-20 02:36:01

标签: c# c++

首先,我阅读了有关此问题的几个问题,其中最有帮助的是: Passing bitmap from c# to c++

由于不断获得AccessViolationException,因此无法获得所提供的解决方案。

我试图做的是将位图数据传递给非托管的c ++ dll。为此,我创建了一个结构,该结构包含指向图像数据及其长度的指针。我正在使用结构,因为我打算将多个图像(在一次调用中)传递给非托管API。

我实现了作品的东西,但我感觉可能存在一些严重的缺陷,因此我对这些缺陷可能是什么感到好奇。

我当前的解决方案使用通用指针来保存图像数据。当我失去类型安全性时,这当然是一个缺点。无论如何,这里是相关代码。

  

c ++ dll

raw_image.h

struct raw_image
{
   void* data;
   int size;
};

alignment.cpp(导出)

ALIGNMENT_API void submit( raw_image& img )
{
    cv::Mat mat = cv::imdecode( cv::_InputArray(
        static_cast<uchar*>( img.data ), img.size ), cv::IMREAD_COLOR );
    cv::imshow( "image", mat );
    cv::waitKey( );
    cv::destroyWindow( "image" );
}
  

C#dll

RawImage.cs

[StructLayout( LayoutKind.Sequential )]
internal unsafe struct RawImage
{
    internal void* ImageData;
    internal int Length;
}

Aligner.cs(导入)

[DllImport( "alignment-vc141-mtd-x64.dll", CallingConvention = 
 CallingConvention.Cdecl )]
    static extern void submit( RawImage img );

这是我将图像传递给非托管API的地方。

using( var bitmap = new Bitmap( "AlignmentCenter.jpg" ) )
using( var stream = new MemoryStream( ) )
{
    bitmap.Save( stream, ImageFormat.Jpeg );
    var source = stream.ToArray( );
    fixed( void* ptr = source )
    {
        var raw = new RawImage
        {
            ImageData = ptr,
            Length = source.Length
        };
        submit( raw );
     }
  }

我在做什么不安全?我复印的数量是否超过我应有的数量? 最后一件事,我对EmguCv有所了解,并且我过去曾经使用过它,但是在这里我不会使用它。

0 个答案:

没有答案