c - C:制作图像映射的缓冲区副本的最佳方法
问题描述
我有一个基本上具有以下内容的结构:
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。
基本上我想知道的是制作这个 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++ - 使用更多的 CPU 功率
- kotlin - 无法在 Kotlin Multiplatform 中访问 fixedRateTimer
- shell - 如何在 shell 脚本中获取变量的值,其中它的名称被另一个变量部分替换?
- c++ - 如何按升序对我最常见的 3-mers 列表进行排序?
- angular - 删除最后一次出现的字符`"`的字符串操作
- ios - UITextField如何删除强密码覆盖
- python - 如何在选项卡关闭 django 上从数据库中删除对象
- kotlin - 如何解决 kotlin 协程流的错误?
- java - 在 Java 8 中并行调用两个函数
- c# - 如何在 xamarin 表单中动态更改 CultureInfo