4

有没有人知道是否可以将原始类型作为泛型参数。

请注意,在您开始谈论我不应该如何使用指针之前。

图像是使用IPP分配的原始数据数组,在大多数情况下,我将使用 IPP,这部分是当需要或首选以非 IPP 支持的方式单独处理数据时,以首选格式从非托管数据转换为托管数据。

我需要以下字节,浮点数,短组合中的函数,而不是显式地编写所有组合,我更喜欢一些通用/模板的东西

private static unsafe List<PixelF> GetPixels<Timg,Tmask>(
  VMImage img, 
  int band, 
  VMImage imgMask, 
  int bandMask)

其中 Timg 和 TMask 可以为一(字节、短或浮点)

现在,一个函数看起来像这样。

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);
    }

给出错误(无法获取托管类型的地址、大小或声明指向托管类型的指针。)

编辑* * 基本上,我需要知道的是指针的大小(字节,短,浮点数),当然,它必须在以后正确地转换为浮点数,

4

1 回答 1

2

我的建议是在单独的托管 C++ 程序集(也称为 C++/CLI)中执行此操作,其中公共 .NET API 公开您的通用类型接口,并且与“不安全”指针相关的内容发生在本机代码中。

于 2013-06-29T15:01:22.523 回答