C: Лучший способ сделать буферную копию карты изображений - PullRequest
0 голосов
/ 31 мая 2018

У меня есть структура, которая в основном имеет следующее содержимое:

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

У меня есть изображение "map" в моей ссылке с именем img.

По сути, я хочу знать, каков наилучший способ сделать копию этого img, чтобы я мог применить фильтр в этом буфере img, например, фильтр размытия.Таким образом, когда я получаю значения окружающих пикселей для записи в центральный, это всегда исходные пиксели, поэтому беру пиксели из «img» и записываю их с фильтром в «img_buffer».

Я думаю,Я мог бы просто сделать еще одну ссылку с именем img_buff и снова вызвать функцию open_image, но это отнимает много реального и пользовательского времени.

Так как бы вы предложили мне сделать копию?Из моего исследования я обнаружил, что memcpy (), возможно, не справится с задачей, поскольку дает мне мелкую копию, но не уверен в этом.

Любое предложение, которое не займет намного больше реального времени / времени пользователяДобро пожаловать!

1 Ответ

0 голосов
/ 31 мая 2018

Если вы хотите улучшить производительность, вам следует избегать копий, которые отнимают много времени, особенно для больших массивов.

Но я полагаю, что вы не можете, поэтому есть решение:

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