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

Messages postés
33
Date d'inscription
jeudi 2 septembre 2004
Dernière intervention
27 septembre 2004
- 9 sept. 2004 à 16:34 - Dernière réponse :
Messages postés
33
Date d'inscription
jeudi 24 avril 2003
Dernière intervention
25 mai 2005
- 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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Dernière intervention
27 novembre 2004
- 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é 88 internautes ce mois-ci

Commenter la réponse de cs_djl
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Dernière intervention
16 mars 2011
- 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
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Dernière intervention
8 octobre 2007
- 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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Dernière intervention
27 novembre 2004
- 9 sept. 2004 à 22:37
0
Merci
rgb + alpha on appel ca rgba
Commenter la réponse de cs_djl
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Dernière intervention
8 octobre 2007
- 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
Messages postés
33
Date d'inscription
jeudi 2 septembre 2004
Dernière intervention
27 septembre 2004
- 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
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Dernière intervention
16 mars 2011
- 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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Dernière intervention
27 novembre 2004
- 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
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Dernière intervention
16 mars 2011
- 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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Dernière intervention
27 novembre 2004
- 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
Messages postés
33
Date d'inscription
jeudi 2 septembre 2004
Dernière intervention
27 septembre 2004
- 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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Dernière intervention
27 novembre 2004
- 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
Messages postés
33
Date d'inscription
jeudi 2 septembre 2004
Dernière intervention
27 septembre 2004
- 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
Messages postés
33
Date d'inscription
jeudi 24 avril 2003
Dernière intervention
25 mai 2005
- 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.