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

标签 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;

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

所以现在当我在我的主文件中调用函数时:

image img = open_image("file_name");

我在名为 img 的引用中有我的图像“ map ”。

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

我想我可以创建另一个名为 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);

关于C:制作图像映射缓冲区副本的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50613552/

相关文章:

C 自定义数据库写入错误

java - 在不损失质量的情况下读取/写入 JPG 图像的最快方法?

c++ - C++与OpenCV的图像对比方法

c++ - 无法将类构造函数中新创建的对象复制到 C++ 中的 vector 成员

sql-server - 将数据库数据从多个 DB 复制到一个。数据复制(某种)

总结类实例时 C++ 崩溃

c - 系统编程 : wait(&status)'s return value

c - GCC __attribute__ ((对齐 (8))) 不起作用

c - 如何根据 C 函数中函数的输入退出 while 循环?

java - SWT:从图像中获取子图像