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

通过结构将C位图传递给C++

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

    首先,我读了一些关于这个问题的问题,最有帮助的是: Passing bitmap from c# to c++

    我无法得到所提供的解决方案,因为我不断得到 AccessViolationException 是的。

    我试图做的是将位图数据传递到非托管的C++dll。为此,我创建了一个结构,其中包含指向图像数据及其长度的指针。我在计划将多个映像(在一次调用中)传递给非托管api时使用了一个struct。

    我实现了什么 作品 但我有一种感觉,可能有一些严重的缺点,所以我很好奇这些缺点可能是什么。

    我当前的解决方案使用一个通用指针来保存图像数据。这当然是一个缺点,因为我失去了类型安全。不管怎样,这是相关的代码。

    C++动态链接库

    原始图像.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" );
    }
    

    动态链接库

    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 回复  |  直到 7 年前