Coder une image niveaux de gris en RGB [Résolu]

gilimcce 33 Messages postés jeudi 2 septembre 2004Date d'inscription 27 septembre 2004 Dernière intervention - 9 sept. 2004 à 16:34 - Dernière réponse : martinbrochet 33 Messages postés jeudi 24 avril 2003Date d'inscription 25 mai 2005 Dernière intervention
- 25 mai 2005 à 14:10
Il semblerait que mes problèmes de texture soit liée à cela :
je charge une image en niveau de gris, alors que ma fonction
chargeant l'image attend une image RGB... Du coup il manque
des informations et le mappage n'est que partiel.

Je ne comprends pas bien la méthode qui permettrais
de passer de l'un à l'autre...

Comme d'habitude....

Merci de m'aider à y remédier.
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
cs_djl 3011 Messages postés jeudi 26 septembre 2002Date d'inscription 27 novembre 2004 Dernière intervention - 9 sept. 2004 à 17:02
3
Merci
en niveau de gris, une couleur = 1octets
en rgb, 1 couleurs = 3octets

donc tu alloues un bufffer 3 fois plus gros et tu copie chaque octet en triple (concecutivement)

Merci cs_djl 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de cs_djl
magic_Nono 1878 Messages postés jeudi 16 octobre 2003Date d'inscription 16 mars 2011 Dernière intervention - 9 sept. 2004 à 17:58
0
Merci
moé,

le rendu risque de ne po etre genial de tte façon

au mieux, fais toi une table de correspondance avec le rsltt a visualiser en dynamique

Magic Nono: l'informagicien! 8-)
Commenter la réponse de magic_Nono
cs_eRoZion 241 Messages postés vendredi 23 mai 2003Date d'inscription 8 octobre 2007 Dernière intervention - 9 sept. 2004 à 21:02
0
Merci
djl > "en rgb, 1 couleurs = 3octets"
Faut faire gaffe, ça c'est le cas des image rgb_24-bits, mais dans celui des images rgb_32-bits, il y a 4 octets à lire, le 4ème étant la transparance alpha (et c'est aujourdhui le format le plus souvent utilisé par defaut).

gilimcce > tu peux aussi tout simplement convertir le type de ton image à l'aide d'un logiciel de retouche. La démo d'acdsee (par exemple) le fait très bien et l'image est strictement la même visuellement. Par contre le fichier final est forcément plus lourd.

eRoZion
Commenter la réponse de cs_eRoZion
cs_djl 3011 Messages postés jeudi 26 septembre 2002Date d'inscription 27 novembre 2004 Dernière intervention - 9 sept. 2004 à 22:37
0
Merci
rgb + alpha on appel ca rgba
Commenter la réponse de cs_djl
cs_eRoZion 241 Messages postés vendredi 23 mai 2003Date d'inscription 8 octobre 2007 Dernière intervention - 9 sept. 2004 à 22:54
0
Merci
Exact, mais nombreux sont les logiciels et les docs qui par abus de langage ne font pas la distinction.
Autant donner à gilimcce tous les éléments pour y arriver. :)

eRoZion
Commenter la réponse de cs_eRoZion
gilimcce 33 Messages postés jeudi 2 septembre 2004Date d'inscription 27 septembre 2004 Dernière intervention - 9 sept. 2004 à 23:25
0
Merci
Ah vous etes forts....
Bon, toutefois :

=> pas de souci avec le parametre alpha. Les ".jpeg" ne sont codés que sur trois octets RGB.
=> en copiant l'octet courant dans chaque case RGB, j'obtiens mon mapping complet...
=> pour etre plus clair, je vous livre le code :

AVANT ////////////

jpeg_start_decompress(&cinfo);
ligne=image;
while (cinfo.output_scanline<cinfo.output_height)
{
ligne=image+3*1440*cinfo.output_scanline;
jpeg_read_scanlines(&cinfo,&ligne,1);
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);

// rearangement de l'image scannee dans le tableau de texture 3D

for (i=0;i<720;i++)
for (j=0;j<1440;j++)
{
texture[i][j][0]=image[i*1440*3+j*3];
texture[i][j][1]=image[i*1440*3+j*3+1];
texture[i][j][2]=image[i*1440*3+j*3+2];
}

APRES /////////////////

jpeg_start_decompress(&cinfo);
ligne=image;
while (cinfo.output_scanline<cinfo.output_height)
{
ligne=image+1440*cinfo.output_scanline;
jpeg_read_scanlines(&cinfo,&ligne,1);
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);

// rearangement de l'image scannee dans le tableau de texture 3D

for (i=0;i<720;i++)
for (j=0;j<1440;j++)
{
texture[i][j][0]=image[i*1440+j];
texture[i][j][1]=image[i*1440+j];
texture[i][j][2]=image[i*1440+j];
}
}

FIN /////////

Au plaisir de solliciter une nouvelle fois votre aide,
ce qui devrait etre pour bientot.

Gil
Commenter la réponse de gilimcce
magic_Nono 1878 Messages postés jeudi 16 octobre 2003Date d'inscription 16 mars 2011 Dernière intervention - 10 sept. 2004 à 08:57
0
Merci
jpeg_start_decompress & autres...
inconnues au bataillon

Ca a l'air sympa se genre de fonction, mais d'ou ça sort, pourras tu produire une srce complète?
on a po les includes tes lib etc

Merci.

Magic Nono: l'informagicien! 8-)
Commenter la réponse de magic_Nono
cs_djl 3011 Messages postés jeudi 26 septembre 2002Date d'inscription 27 novembre 2004 Dernière intervention - 10 sept. 2004 à 09:33
0
Merci
c'est la jpeglib (la bibliotheque de base pour manipuler de jpeg), enfin moi j'en connais pas d'autres, devil et imagemagik l'utilise

tu croyais que c'etais quoi ?
Commenter la réponse de cs_djl
magic_Nono 1878 Messages postés jeudi 16 octobre 2003Date d'inscription 16 mars 2011 Dernière intervention - 10 sept. 2004 à 09:46
0
Merci
bien

actuellement, j'utilise les lead tools (bibliothèque payante)
qui gère tous les formats d'images.

après il en existe beaucoup d'autres...

peux tu donner une url pour cette lib? car je suppose qu'elle est libre... => download & tut.
ça évitera à ceux intéressés de chercher.

++
Magic Nono: l'informagicien! 8-)
Commenter la réponse de magic_Nono
cs_djl 3011 Messages postés jeudi 26 septembre 2002Date d'inscription 27 novembre 2004 Dernière intervention - 10 sept. 2004 à 09:54
0
Merci
http://www.programmersheaven.com/d/click.aspx?ID=F14954

a ma connaissance c'est libre, pas comme le gif par ex
Commenter la réponse de cs_djl
gilimcce 33 Messages postés jeudi 2 septembre 2004Date d'inscription 27 septembre 2004 Dernière intervention - 10 sept. 2004 à 10:47
0
Merci
// la fonction provient d'un tutoriel
// http://www.linuxgraphic.org/
// par xavier michalon
// Bye !

// la lib jpeg est ecrite en C et non pas en C++
#ifdef __cplusplus
extern "C" {
#endif
#include <jpeglib.h>
#include <jerror.h>
#ifdef __cplusplus
}
#endif

void loadJpegImage(char *fichier)
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE *file;
unsigned char *ligne;
int i,j;

cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
if ((file=fopen(fichier,"rb"))==NULL)
{
char phr[100]; vidage(phr,100);

strcat(phr,"Erreur : impossible d'ouvrir le fichier ");
strcat(phr,VAR);
strcat(phr,".jpg\n");

fprintf(stderr,phr);
vidage(phr,100);
exit(1);
}
jpeg_stdio_src(&cinfo, file);
jpeg_read_header(&cinfo, TRUE);

if ((cinfo.image_width!=1440)||(cinfo.image_height!=720)) {
fprintf(stdout,"Erreur : l'image doit etre de taille 1440x720\n");
exit(1);
}

if (cinfo.jpeg_color_space==JCS_GRAYSCALE)
{
jpeg_start_decompress(&cinfo);
ligne=image_gris;
while (cinfo.output_scanline<cinfo.output_height)
{
ligne=image_gris+1440*cinfo.output_scanline;
jpeg_read_scanlines(&cinfo,&ligne,1);
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);

// rearangement de l'image scannee dans le tableau de texture 3D
// ici nous sommes en niveau de gris, donc on copie le meme octet dans
// chacune des 3 cases RGB
// merci � jonatahn

for (i=0;i<720;i++)
for (j=0;j<1440;j++)
{
texture[i][j][0]=image_gris[i*1440+j];
texture[i][j][1]=image_gris[i*1440+j];
texture[i][j][2]=image_gris[i*1440+j];
}
}

else
{
jpeg_start_decompress(&cinfo);
ligne=image_rgb;
while (cinfo.output_scanline<cinfo.output_height)
{
ligne=image_rgb+3*1440*cinfo.output_scanline;
jpeg_read_scanlines(&cinfo,&ligne,1);
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);

// rearangement de l'image scannee dans le tableau de texture 3D

for (i=0;i<720;i++)
for (j=0;j<1440;j++)
{
texture[i][j][0]=image_rgb[i*1440*3+j*3];
texture[i][j][1]=image_rgb[i*1440*3+j*3+1];
texture[i][j][2]=image_rgb[i*1440*3+j*3+2];
}
}
}
Commenter la réponse de gilimcce
cs_djl 3011 Messages postés jeudi 26 septembre 2002Date d'inscription 27 novembre 2004 Dernière intervention - 10 sept. 2004 à 10:57
0
Merci
on a jamais dit que c'etais du c++ ? toutes les bibliotheques sont codé en c, c++ parfois mais C avant tous
Commenter la réponse de cs_djl
gilimcce 33 Messages postés jeudi 2 septembre 2004Date d'inscription 27 septembre 2004 Dernière intervention - 12 sept. 2004 à 22:30
0
Merci
Euh....
Ce n'était qu'un commentaire dans mon code,
donc adressé aux non exercés... en général
et à moi en particulier.

Ciao
:o)
Commenter la réponse de gilimcce
martinbrochet 33 Messages postés jeudi 24 avril 2003Date d'inscription 25 mai 2005 Dernière intervention - 25 mai 2005 à 14:10
0
Merci
bonjour je souhaite faire l'inverse dois simplement fair le moyenne
des du R G B (cad (R+G+B)/3) ca peut pas etre aussi simple tout de meme
?????

comment qu'on fait alors pour passer du 24 bits au 8 bits?

merci d'avance


Martin B
Commenter la réponse de martinbrochet

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.