有没有人知道是否可以将原始类型作为通用参数.
请注意,在开始讨论我不应该如何使用指针之前.
图像是使用IPP分配的原始数据阵列,大多数情况下我将使用IPP,这部分是当需要或优选以非IPP支持的方式单独处理数据时,以优选格式从非托管数据到托管数据的转换.
我需要在byte,float,short组合中使用以下函数,而不是显式地编写所有组合,我更喜欢一些通用/模板的东西,在风格上
private static unsafe List<PixelF> GetPixels<Timg,Tmask>(
VMImage img,
int band,
VMImage imgMask,
int bandMask)
Timg和TMask可以是一个(byte,short或float)
现在,一个函数看起来像这样.
private static unsafe List<PixelF> GetPixels_FloatImg_ByteMask(
VMImage img,
int band,
VMImage imgMask,
int bandMask)
{
List<PixelF> pixValues = new List<PixelF>();
int r, c;
int imgSrcOffset = img.LineLength - img.Width;
int imgMaskOffset = imgMask.LineLength - imgMask.Width;
float* pf_imgSrc = (float*)img.GetRoiPointer(band);
byte* pb_imgMask = (byte*)imgMask.GetRoiPointer(bandMask);
for (r = 0; r < img.Height; r++) // Loop over rows
{
for (c = 0; c < img.Width; c++) // Loop over columns
{
if (*pb_imgMask > 0)
{
pixValues.Add(new PixelF(c, r, (float)*pf_imgSrc));
}
++pf_imgSrc;
++pb_imgMask;
}
pf_imgSrc += imgSrcOffset;
pb_imgMask += imgMaskOffset;
}
return pixValues;
}
编辑**
以下是我想做的事情:
private static unsafe List<PixelF> GetPixels<Timg, Tmask>(
VMImage img,
int band,
VMImage imgMask,
int bandMask)
{
List<PixelF> pixValues = new List<PixelF>();
int r, c;
int imgSrcOffset = img.LineLength - img.Width;
int imgMaskOffset = imgMask.LineLength - imgMask.Width;
Timg* pf_imgSrc = (Timg*)img.GetRoiPointer(band);
Tmask* pb_imgMask = (Tmask*)imgMask.GetRoiPointer(bandMask);
for (r = 0; r < img.Height; r++) // Loop over rows
{
for (c = 0; c < img.Width; c++) // Loop over columns
{
if (*pb_imgMask > 0)
{
pixValues.Add(new PixelF(c, r, (float)*pf_imgSrc));
}
++pf_imgSrc;
++pb_imgMask;
}
pf_imgSrc += imgSrcOffset;
pb_imgMask += imgMaskOffset;
}
return pixValues;
}
我期待我可以在c中作为模板,但是在c#中是否可能
编辑***
正如shambulator指出的那样,只是想做
private static unsafe GetPixels_ByteImg_FloatMask<TImg, TMask>(
VMImage img,
int band,
VMImage imgMask,
int bandMask)
where TImg : struct where TMask : struct
{
TImg* pb_imgSrc = (TImg*)img.GetRoiPointer(band);
}
给出了错误
(不能获取地址,获取大小,或声明指向托管类型的指针.)
编辑**
基本上,我需要知道的是指针的大小(byte,short,float)和当然,它必须在以后正确地转换为浮点数,
最佳答案 我的建议是在一个单独的Managed C程序集(又名C/C++LI)中执行此操作,其中公共.NET API公开您的通用类型接口,并且“不安全”指针相关的东西发生在本机代码中.