Bonjour,
Je rencontre actuellement un problème lors de la manipulation d'images sous C++ Builder 6. Je cherche à faire le produit entre 2 images, c'est à dire la multiplication des couleurs de chacun des pixels de 2 images afin de réaliser un "fondu" entre les 2.
Jusqu'à présent, j'utilisais une méthode manuelle : le parcours de chaque pixel composant les 2 images, et la multiplication des couleurs obtenues afin d'obtenir une nouvelle couleur mélangeant les 2. Cette méthode fonctionne très bien, mais elle a un inconvénient, elle est longue si les images sont très grandes.
J'ai découvert une méthode plus aisée avec C++ Builder et la classe TGraphics::TBitmap : les masques, et l'utilisation de cmSrcAnd, qui permet de faire cette multiplication. C'est quasiment instantané. Or, il advient que certaines couleurs sont mal multipliées entre elles !(cf images ci-dessous comparant le résultat de cmSrcAnd, en haut, et mon image, en bas)
Code utilisant cmSrcAnd :
Code perso multipliant chaque pixel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 image1 = new TBitmap(); image1->LoadFromFile("image1.bmp"); sortie = new TBitmap(); sortie->LoadFromFile("image2.bmp"); source = Rect(0, 0, 100, 200); dest = Rect(0, 0, 100, 200); sortie->Canvas->CopyMode = cmSrcAnd; sortie->Canvas->CopyRect(dest, image1->Canvas, source); sortie->SaveToFile("fusion.bmp"); delete sortie; delete image1;
Qu'en pensez-vous ? D'où peut prevenir le problème avec cmSrcAnd ? Y'a-t'il un moyen d'accélérer encore mon traitement des 2 images ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 BYTE bR,bR1,bR2; BYTE bG,bG1,bG2; BYTE bB,bB1,bB2; BYTE *ligne2, *ligne; bool end; for(y=0;y<200;++y) { ligne = (BYTE *)fond->ScanLine[y-y_surfer+y_fond]; ligne2 = (BYTE *)surfer->ScanLine[y]; end=false; for(x=0;x<100;++x) { try { bR1 = ligne[3*x+2]; bG1 = ligne[3*x+1]; bB1 = ligne[3*x]; bR2 = ligne2[3*x+2]; bG2 = ligne2[3*x+1]; bB2 = ligne2[3*x]; bR = int((bR1*bR2)/256.); bG = int((bG1*bG2)/256.); bB = int((bB1*bB2)/256.); sortie->Canvas->Pixels[x][y] = (TColor)RGB(bR, bG, bB); } catch(...) { end = true; } } }
En vous remerciant par avance !
Partager