有人知道是否可以将原始类型作为通用参数吗。
请注意,在开始讨论我不应该使用指针之前。
这些图像是使用IPP分配的原始数据数组,大部分时间我会使用IPP,这部分是在需要或更喜欢以非IPP支持方式单独处理数据时将数据从非托管转换为托管数据的过程。
我需要以下字节、浮点、短组合的函数,而且我希望使用一些通用/模板风格的东西,而不是编写所有明确的组合。
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),当然,它必须正确地转换为float后使用。
T
,问题的根源似乎在于无法声明T* pf_imgSrc
(无法获取托管类型的地址、大小或声明指向托管类型的指针)。即使使用struct
泛型约束也不行。 - anton.burger