首先,我阅读了有关此问题的几个问题,其中最有帮助的是: 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
有所了解,并且我过去曾经使用过它,但是在这里我不会使用它。