Convertir un JPEG stocké en RAM

Convertir un JPEG stocké en RAM - C - Programmation

Marsh Posté le 28-07-2007 à 08:46:07    

Salut,
 
J'ai le soucis suivant : je cherche à convertir un JPEG qui est stocké en RAM en BMP mais ceci doit se faire au sein de la RAM.
 
J'ai simplement un pointeur vers une image JPEG stockée en RAM et je souhaite la convertir. Les seules fonctions que j'ai rencontrées dans libjpeg sont des fonctions qui prennent un chemin vers un fichier en entrée.
 
J'ai essayé de passer ce pointeur en le castant en FILE, mais il me jette en faisant une segfault. Je vous colle quand même le code que j'ai utilisé à la fin du message (memory.chunk pointe vers le début du fichier en mémoire).
 
Existe-t-il une fonction qui prend un pointeur vers une image JPEG en entrée et qui transforme cette image en BMP ?
 

Code :
  1. struct jpeg_decompress_struct cinfo;
  2. struct jpeg_error_mgr jerr;
  3. cinfo.err = jpeg_std_error(&jerr);
  4. jpeg_create_decompress(&cinfo);
  5. jpeg_stdio_src(&cinfo, (FILE*)chunk.memory);
  6. jpeg_read_header(&cinfo, TRUE);    <-- Ca SEGFAULT ici
  7. jpeg_start_decompress(&cinfo);


 
Merci beaucoup.

Reply

Marsh Posté le 28-07-2007 à 08:46:07   

Reply

Marsh Posté le 28-07-2007 à 10:44:38    

jpeg_read_header doit tenter de lire depuis ton pointeur en memoire avec des primitives d'acces aux fichier.
rassure-toi, tu n'est pas le seul à chercher une solution, cf google
 
http://www.google.fr/search?q=jpeg [...] =firefox-a
http://developer.popcap.com/forums [...] php?t=2459

Reply

Marsh Posté le 28-07-2007 à 20:17:47    

sophocle38 a écrit :

J'ai essayé de passer ce pointeur en le castant en FILE, mais il me jette en faisant une segfault.


C'est évident. Une structure de type "FILE" est une structure bien spéciale qui permet de gérer des fichiers. Cette structure est initialisée par fopen(). Toi, t'as un pointeur qui pointe vers une zone qui n'a absolument aucun rapport avec une structure FILE. Même si tu castes ce pointeur, la zone pointée ne deviendra pas de type "FILE" pour autant...

sophocle38 a écrit :

J'ai simplement un pointeur vers une image JPEG stockée en RAM et je souhaite la convertir. Les seules fonctions que j'ai rencontrées dans libjpeg sont des fonctions qui prennent un chemin vers un fichier en entrée.


Tu veux sans doute dire "qui prennent un pointeur de type FILE*". La première solution batarde serait de descendre ton BMP dans un fichier mais tu as sûrement dû y penser. Une autre solution pourrait être une approche équivalente (si t'es sur un système norme POSIX style UNIX/LINUX)
1) tu crées une fonction qui benne ton BMP dans un pipe mémoire
2) de l'autre coté (probablement un fork), tu ouvres ton pipe (open) et tu dupliques le canal de lecture vers un FILE *...


Message édité par Sve@r le 28-07-2007 à 20:18:56

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 29-07-2007 à 12:06:15    

Tu peux aussi checker du coté de cximage sur codeproject, ca peut te donner des pistes. Ce sont des sources de conversions de formats d'images, bien foutu et free.


---------------
Töp of the plöp
Reply

Marsh Posté le 29-07-2007 à 12:42:18    

sinon tu te payes juste un OS et tu fais avec un fichier temporaire et ton BMP restera en RAM tout simplement.

Reply

Marsh Posté le 30-07-2007 à 02:16:33    

Moué, c'est beaucoup plus gore que ça.
 
Si ce que tu as, est vraiment un stream JPEG, tu va devoir rediriger les callbacks de lecture via une structure jpeg_source_mgr (je te laisse le soin de te palucher la doc).
 
Avec ça, tu vas pouvoir récupérer les scanlines de ton image via jpeg_read_scanlines et construire ton BMP à partir de là.
 
Il n'y a pas des masses de codes (100 lignes de C à tout casser) mais l'API de la libjpeg commence à se faire vieille ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed