2009-08-21 5 views
1

Ich versuche, C in der folgenden Funktion zu finden in CImgMultiplying und das Hinzufügen von Bildern mit CImg In C++

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

Wo C, L und S sind alle RGB-Bilder von der gleichen Größe (und B ist ein Einkanal-Graustufen-matt)

I kann nicht herausfinden, wie über die Pixel in einer Schleife. Ich habe Code gesehen wie:

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

Aber ich habe nie sehen als Art der Syntax vor, könnte es ein Makro sein?

Alle Vorschläge sind willkommen.

Antwort

4

Wenn Sie den CImg Kopf schauen, sehen Sie, dass dieser Code ist in der Tat, ein Makro, das in Thunk nach unten:

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

Was bedeutet, dass Sie die folgenden Schleifen haben:

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

} 

jetzt also, was wollen Sie wahrscheinlich entweder die x, y und z-Koordinaten, oder besser gesagt, der Zeiger in den Datenbezug tun, wie Sie durch wie

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

Ich empfehle Ihnen, den CImg-Header zu lesen; es ist ziemlich elegant. Sie erhalten viele Funktionen "kostenlos".

+0

Danke, das hat ein paar Dinge geklärt. Trotzdem scheine ich nicht in Ordnung/inkonsistente Ergebnisse zu bekommen .. hmm vielleicht sollte ich eine andere Frage – zenna

+0

falsche oder inkonsistente Ergebnisse veröffentlichen als Folge der Bittiefe Probleme passieren kann. Zum Beispiel könnte die Multiplikation leicht tun seltsame und schlechte Dinge Sie mit etwas anderem als float Bilder (dh Byte Bilder werden leicht überlaufen, wenn du nicht aufpasst). – mmr

Verwandte Themen