Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:制作图像映射缓冲区副本的最佳方法_C_Image Processing_Copy_Freeimage - Fatal编程技术网

C:制作图像映射缓冲区副本的最佳方法

C:制作图像映射缓冲区副本的最佳方法,c,image-processing,copy,freeimage,C,Image Processing,Copy,Freeimage,我有一个基本上包含以下内容的结构: typedef struct { unsigned int width, height; float *r, *g, *b; } image; 使用FreeImage.h库,我能够打开某个图像,并将像素与其RGB颜色关联起来。因此,代码如下: imagem open_image(char *name_of_file) { FIBITMAP *bitmapIn; int x, y; RGBQUAD color; image I;

我有一个基本上包含以下内容的结构:

typedef struct {
  unsigned int width, height;
  float *r, *g, *b;
} image;
使用FreeImage.h库,我能够打开某个图像,并将像素与其RGB颜色关联起来。因此,代码如下:

imagem open_image(char *name_of_file) {
  FIBITMAP *bitmapIn;
  int x, y;
  RGBQUAD color;
  image I;

  bitmapIn = FreeImage_Load(FIF_JPEG, name_of_file, 0);

  if (bitmapIn == 0) {
    printf("Error! File not found - %s\n", name_of_file);
  } else {
    printf("File found!\n");
   }

  x = FreeImage_GetWidth(bitmapIn);
  y = FreeImage_GetHeight(bitmapIn);

  I.width = x;
  I.height = y;
  I.r = malloc(sizeof(float) * x * y);
  I.g = malloc(sizeof(float) * x * y);
  I.b = malloc(sizeof(float) * x * y);

   for (int i=0; i<x; i++) {
     for (int j=0; j <y; j++) {
      int idx;
      FreeImage_GetPixelColor(bitmapIn, i, j, &color);

      idx = i + (j*x);

      I.r[idx] = color.rgbRed;
      I.g[idx] = color.rgbGreen;
      I.b[idx] = color.rgbBlue;
    }
   }
  return I;
}
我有我的图像“地图”在我的参考名为img

基本上,我想知道的是,制作这个img副本的最佳方法是什么,这样我就可以在这个缓冲img中应用一个过滤器,例如模糊过滤器。这样,当我得到周围的像素值写入中心像素时,它总是原始像素,因此从“img”中获取像素,并使用过滤器将它们写入“img_缓冲区”

我想我可以做另一个名为img_buff的引用,然后再次调用open_image函数,但这需要大量的实时和用户时间

那你觉得我该怎么做?从我的研究中,我发现memcpy()可能不会起作用,因为它给了我一个肤浅的副本,但不确定


欢迎任何不会占用更多实时/用户时间的建议

如果您想提高性能,应该尽量避免复制,因为复制对于大型阵列来说非常耗时

但我想你不能,所以有一个解决方案:

Image imgCopy;
imgCopy.width  = img.width 
imgCopy.height  = img.height
第一次分配内存时:

imgCopy.r = (float*)malloc(sizeof(float) * imgCopy.width * imgCopy.height );
imgCopy.g = (float*)malloc(sizeof(float) * imgCopy.width * imgCopy.height );
imgCopy.b = (float*)malloc(sizeof(float) * imgCopy.width * imgCopy.height );
然后可以复制指针的内容:

*(imgCopy.r) = *(img.r);
*(imgCopy.g) = *(img.r);
*(imgCopy.b) = *(img.r);

您不需要复制图像,只需要分配一个缓冲区(或3个缓冲区),以便在过滤时写入。使用
malloc
就像你在这里做的那样。过滤后,如果你不再需要原始图像,你可以为原始图像释放内存,让图像指向新的缓冲区。实际上,它不会复制像素的内容。但是,只要创建缓冲区并逐像素扫描复制它就可以满足我的需要
*(imgCopy.r) = *(img.r);
*(imgCopy.g) = *(img.r);
*(imgCopy.b) = *(img.r);