Умножение и добавление изображений с помощью CImg In C ++ - PullRequest
1 голос
/ 21 августа 2009

Я пытаюсь найти C в следующей функции в CImg

С = В * L + (1-B), S

Где C, L и S - все изображения RGB одинакового размера (а B - одноканальный матовый в оттенках серого)

Я не могу понять, как перебрать пиксели. Я видел такой код:

cimg_forXYZ(S,x,y,z) {... }

Но я никогда раньше не видел, какой вид синтаксиса, может ли это быть макрос?

Любые предложения приветствуются.

1 Ответ

4 голосов
/ 21 августа 2009

Если вы загляните в заголовок CImg, вы увидите, что этот код на самом деле является макросом, который преобразуется в:

#define cimg_forXY(img,x,y)       cimg_forY(img,y) cimg_forX(img,x)
#define cimg_forX(img,x)          for (int x=0; x<(int)((img).width); ++x)
#define cimg_forY(img,y)          for (int y=0; y<(int)((img).height); ++y)
#define cimg_forZ(img,z)          for (int z=0; z<(int)((img).depth); ++z)
#define cimg_forXYZ(img,x,y,z) cimg_forZ(img,z) cimg_forXY(img,x,y)

Это означает, что у вас будут следующие циклы:

for (int z=0; z<(int)((img).depth); ++z)
    for (int y=0; y<(int)((img).height); ++y)
        for (int x=0; x<(int)((img).width); ++x) {

}

Итак, теперь вы, вероятно, захотите сделать ссылку на координаты x, y и z или, что лучше, на указатель на данные при переходе, например

cimg_library::CImg<float> image;
//assign, etc
float* ptr = image->ptr();
cimg_forXYZ(S, x, y, z){
    *ptr = *ptr + 10;
    ++ptr;
}

Я рекомендую вам прочитать заголовок CImg; это довольно элегантно. Вы получите много функциональности «бесплатно».

...