2013-06-02 1 views
0

Il semble que ce serait très facile, mais j'ai beaucoup de problèmes en utilisant la fonction draw_image() dans CImg. Voici un extrait de code:Superposition d'images avec CImg

CImg<unsigned char> landingScreen("desertSunset.bmp"), newGameBTN("newgame.pgm"); 
CImgDisplay main_disp(landingScreen,"Main Window"); 
landingScreen.draw_image(400,400,newGameBTN); 

J'ai essayé environ 8 des fonctions surchargées pour draw_image(), en vain. Lorsque je lance le programme, la fenêtre principale apparaît avec mon image desertSunset, mais c'est tout. J'essaie de poser newgame.pgm sur l'écran d'atterrissage, mais l'image n'apparaît pas. Est-ce un problème de profondeur, ou peut-être la façon dont je structure le fichier? J'ai regardé un tas de fichiers d'exemples différents pour CImg mais ils ne sont pas très utiles, et la documentation sur ces fonctions est minimale au mieux. Si quelqu'un pouvait donner un exemple de «Bonjour tout le monde» sur la façon de dessiner une image sur une image, ou de me dire ce que je fais de mal, j'apprécierais beaucoup. Merci!

Répondre

0

Après le dessin, vous devez rafraîchir la fenêtre d'affichage ainsi:

landingScreen.diplay(main_disp); 

Vous choisissez quand la fenêtre d'affichage est actualisé. Ce n'est pas fait automatiquement par certains threads en cours d'exécution.

+0

J'ai ajouté cela, mais cela ne fonctionne toujours pas. Draw_circle() fonctionne très bien, mais draw_image() ne fait toujours rien. – user2446036

0

La fonction CImg.draw_image ne superpose pas les images. Il remplace les pixels. Il existe plusieurs manières de faire une superposition d'images et de compositing alpha et elles doivent être implémentées manuellement (par exemple, Multiplier, Superposer, ...).

Pour mélange alpha normale, voici comment calculer chaque pixel:

A = srcA + DSTA (1 - srcA)
R = (srcR * srcA + DSTR * DSTA * (1 - srcA))/A
G = (srcG * srcA + DSTG * DSTA * (1 - srcA))/A
B = (srcB * srcA + DSTB * DSTA * (1 - srcA))/A

0

J'ai créé deux images comme celle-ci avec ImageMagick:

convert -size 400x300 gradient:red-black PNG24:gradient.png 

enter image description here

convert -size 100x100 xc:yellow overlay.png 

enter image description here

Et puis a couru ce code CImg:

#define cimg_use_png 
#define cimg_display 0 
#include "CImg.h" 
using namespace cimg_library; 
int main() { 
    CImg<unsigned char> gradient("gradient.png"); 
    CImg<unsigned char> overlay("overlay.png"); 
    gradient.draw_image(80,150,overlay); 
    gradient.save_png("result.png"); 
} 

et a obtenu ceci:

enter image description here