2013-01-03 4 views
2

J'utilise CImg combiné avec libpng dans Visual Studio 2010 pour afficher des images png. Lorsque j'affiche l'image en utilisant CImg, il semble que la transparence ne s'affiche pas correctement. Je ne suis pas en justice si cela ne me permet pas de saisir pleinement les concepts de CImg, une erreur que je fais, ou une combinaison des deux!CImg n'affiche pas les images png transparentes correctement?

image showing the problem described

L'image à gauche montre l'image ouverte dans les fenêtres visionneuse photo - avec l'arrière-plan transparent comme prévu. L'image sur la droite montre l'écran CImg qui affiche en réalité un fond blanc pur avec quelques zones brunes étranges entourant le personnage. CImg charge le png avec le 4ème canal alpha (comme indiqué dans le titre de la fenêtre d'image de droite)

Lorsque vous passez la souris sur les zones de l'affichage CImg, les valeurs de transparence correctes s'affichent dans la petite fenêtre contextuelle (en bas à gauche de l'image de droite). CImg semble dessiner tout, indépendamment de la valeur de transparence?

Ma question est, comment puis-je obtenir Cimg pour afficher correctement un pgn avec des sections transparentes?

Mon code pour cet exemple est la suivante:

#define cimg_use_png 
#include <CImg.h> 
using namespace cimg_library; 

int main() 
{ 
    CImg<unsigned char> image("image.png"); 
    image.display(); 
    return 0; 
} 

Répondre

3

Le spectateur d'affichage par défaut de CImg montre seulement les 3 premiers canaux de votre image. Il ignore même que le 4ème canal est en effet un canal de transparence, il pourrait être autre chose (le canal K pour une image codée CMJN par exemple). CImg ne stocke pas ce type d'information, il permet à l'utilisateur de savoir ce qu'il manipule à la fin. Si vous avez un 4 canaux pour la transparence et ce pour l'afficher dans CImg, vous devez créer une petite procédure de rendu par vous-même, comme ceci:

CImg<unsigned char> render(img.width(),img.height(),1,3,255); 
render.draw_image(0,0,0,0,img,img.get_channel(3),1,255); 

(en supposant « img » est votre image 4 canaux). Maintenant, 'rendu' est une image couleur RVB qui est un rendu de votre image initiale (transparente) sur un fond blanc.

+0

Merci, cela fonctionne parfaitement! – TVOHM

Questions connexes