#1 

11-06-2009 09:45:24

knightking
Membres
Date d'inscription:
Messages: 5
IP: 194.254.104.254
Courriel

Bonjour,

je charge un modèle 3ds, dont les fichiers de textures sont constitués par des images PNG 16 bits (donc 65535 niveaux par canal).
La manipulation

video::IImage * image;
image = driver-> createScreenShot();
driver ->writeImageToFile(image, "image.png", 85);

me permet de récupérer le résultat du screenshot. Mais le fichier image.png est sur 8 bits (donc 255 niveaux par canal), ce qui me fait perdre énormément d'informations.
J'ai constaté qu'il y avait un type SColorf permettant de spécifier qu'une image est en flottant par canal. Cependant la fonction
beginScene(true, true, Scolor(...));

ne permet pas de spécifier au driver de travailler en flottants, vu que le 3ème paramètre est un Scolor.

D'où mes questions :
existe-il une façon de spécifier au driver vidéo de travailler avec de telles images 16 bits ?
Ou bien y-a-t-il moyen de spécifier lors du writeImageToFile, qu'on veut du 16 bits ?


Hors ligne


#2 

11-06-2009 16:36:16

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 92.146.210.116
Courriel  Site web

Device->getVideoDriver()->setTextureCreationFlag(ETCF_ALWAYS_16_BIT,true); je sais pas, peut-être...


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#3 

12-06-2009 17:40:00

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 90.5.31.50
Courriel  Site web

video::IImage *image;
image = driver->createScreenShot();
image = driver->createImage(video::ECF_A1R5G5B5,image);
driver ->writeImageToFile(image, "image.png");

sa devrait le faire, sinon changer se que dit copland avans le screenshot et rétablir après si besoin est
peut-être mettre un nouveaux pointeur pour l'image en 16 bit

sinon teste avec image->copyToScaling((void*)image.....
tu peut utiliser l'operator *& pour faire une copie d'un pointeur wink

Hors ligne


#4 

17-06-2009 14:31:22

knightking
Membres
Date d'inscription:
Messages: 5
IP: 194.254.104.254
Courriel

J'ai programmé les deux solutions proposées par Copland et par Magun mais elles ne fonctionnent pas. En effet, l'image que j'obtiens est une image couleur dont chaque canal Rouge, Vert, et Bleu est codé sur 255 niveaux de gris alors que je souhaite avoir 65535 niveaux de gris par canal
.
En fait le problème ne semble pas avoir de solution actuelle de par la définition même de la fonction de capture et du type IImage de Irrlicht. En effet, l'étude du fichier

 COpenGLDriver.cpp

décrivant la fonction createScreenShot()
nous indique que les images sont toutes définies ou "castées" en u8 pour chaque canal du pixel. Or la définition de u8 se trouve irrTypes.h et correspond à
00015 #ifdef _MSC_VER
00016 typedef unsigned __int8         u8;
00017 #else
00018 typedef unsigned char           u8;
00019 #endif

soit 1 octet, donc 255 valeurs possibles seulement ! :-(


Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
154 invités en ligne
membre en ligne: -
RSS Feed