首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C:制作图像映射缓冲区副本的最佳方法

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

Stack Overflow用户
提问于 2018-05-31 05:24:33
回答 1查看 331关注 0票数 1

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

代码语言:javascript
复制
typedef struct {
  unsigned int width, height;
  float *r, *g, *b;
} image;

使用FreeImage.h库,我能够打开某个图像并将像素与其RGB颜色相关联。所以代码如下所示:

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
image img = open_image("file_name");

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

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

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

你觉得我该怎么做呢?从我的研究中,我发现memcpy()可能不会起作用,因为它给了我一个浅拷贝,但我不确定它是不是真的。

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-31 19:32:45

如果你想提高性能,你应该尽量避免拷贝,因为拷贝很耗时,特别是对于大型数组。

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

代码语言:javascript
复制
Image imgCopy;
imgCopy.width  = img.width 
imgCopy.height  = img.height

在第一次分配内存时:

代码语言:javascript
复制
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 );

然后,您可以复制指针的内容:

代码语言:javascript
复制
*(imgCopy.r) = *(img.r);
*(imgCopy.g) = *(img.r);
*(imgCopy.b) = *(img.r);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50613552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档