首先,我读了一些关于这个问题的问题,最有帮助的是:
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
我以前也用过,但现在不用了。