2009-08-21 16 views
1

Je suis en train de trouver C dans la fonction suivante dans CImgMultiplying et en ajoutant des images avec CImg en C++

C = B * L + (1-B) S

Où C, L et S sont tous Images RVB de la même taille (et B est un cache en niveaux de gris monocanal)

Je n'arrive pas à comprendre comment faire une boucle sur les pixels. J'ai vu le code comme:

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

Mais je n'ai jamais vu de type de syntaxe avant, pourrait-il être une macro?

Toutes les suggestions sont les bienvenues.

Répondre

4

Si vous regardez dans l'en-tête CImg, vous verrez que ce code est, en fait, une macro qui Thunks en:

#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) 

Ce qui signifie que vous aurez les boucles suivantes:

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) { 

} 

donc, maintenant, ce que vous voulez sans doute faire référence est soit x, y, z et les coordonnées, ou mieux, le pointeur dans les données que vous franchissez, comme

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

Je vous encourage à lire l'en-tête CImg; c'est assez élégant. Vous obtiendrez beaucoup de fonctionnalités 'gratuitement'.

+0

Merci, cela a éclairci quelques choses. Pourtant, je semble obtenir des résultats incorrects/incohérents .. hmm peut-être que je devrais poster une autre question – zenna

+0

des résultats incorrects ou incohérents peuvent se produire en raison de problèmes de profondeur de bit. Par exemple, cette multiplication pourrait facilement vous faire des choses étranges et mauvaises avec autre chose que des images flottantes (c.-à-d., Les images d'octets dépasseront facilement si vous ne faites pas attention). – mmr