HELP ME !!! Passer une image JPEG en BMP. Projet de fin d'année

Signaler
Messages postés
3
Date d'inscription
dimanche 24 février 2002
Statut
Membre
Dernière intervention
28 mars 2002
-
Messages postés
10
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
6 mai 2006
-
Bonjour à tous,
Auriez vous un source me permettant de transformer une image JPEG en BMP. Tout cela d'une manière simple et compréhensive pour un débutant en programmation.
J'utilise en priorité C++ Builder 3.0.
Ne me laissez pas tomber c'est pour mon projet de fin d'étude.
Merci

20 réponses

Messages postés
1
Date d'inscription
vendredi 12 avril 2002
Statut
Membre
Dernière intervention
12 avril 2002

Salut !

Je fais remonter le topic car cela m'intéresserait beaucoup également. Pour l'instant, je ne sais charger que les images au format PGM ce qui convient bien sous UNIX. Mais sous Windows, le format de référence est le BMP ou le JPEG... Il me faudrait une fonction (ou classe) me permettant de charger une image JPEG ou BMP dans un buffer...

Merci aux connaisseurs de répondre...
Messages postés
3
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
3 mai 2005

Salut !

Manifestement je ne suis pas le seul dans ce cas !
Je dois réaliser une détection d'intrus depuis une caméra Axis 2100 ( caméra ip) qui fournit des images en jpeg uniquement ( à moins que je me trompe ). Mes profs l'ont acheté sans lire la notice technique...

Le problème est que je dois travaillé pixel par pixel ( imposé par le sujet ) et que je dois ensuite afficher l'image dans un programmes sous C++ Builder 3.0 .

Je suis donc à la recherche d'un composant permettant d'aller de JPEG à bmp, voir TIF ( c pas genant ) et si il peut faire aussi dans l'autre sens c pas plus mal non plus :)

Merci d'avance
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
j'ai ce qu'il vous faut sa marche car j'ai le même projet et la
détéction marche pour l'instant mais doit être optimisé voici le code
mais si vous l'optimisé faite moi signe.



#include "clDetectionMouv.h"



//*****************************************************************************

DetectionMouv::DetectionMouv(int i_seuil, TJPEGImage *_p_image, AnsiString _s_nomCadre)



{

seuilDetect = i_seuil;

p_image = _p_image;

s_nomCadre = _s_nomCadre;



Graphics::TBitmap * jpgCompar = new Graphics::TBitmap;



DetectionMouvement (p_image, s_nomCadre);

}

//*****************************************************************************

void DetectionMouv::ActiverDetect ( bool Autorisation)

{

b_detect = Autorisation;

}

//*****************************************************************************

void DetectionMouv::DetectionMouvement (TJPEGImage *_p_image,
AnsiString s_nomCadre) //avt
utils::SharedPtr& _p_media

{

Graphics::TBitmap * bmp2 = new Graphics::TBitmap;

bmp2->Assign(_p_image);

bmp2->PixelFormat = pf8bit; //avt pf4bit

int cpt = 0;

int *ptr1;

int *ptr2;



Graphics::TBitmap * jpgCompar = new Graphics::TBitmap;

jpgCompar->LoadFromFile("C:\"+s_nomCadre+".bmp");



for ( int i_y = 0; i_y <= bmp2->Height-1; ++i_y)

{

ptr1 = (int *)jpgCompar->ScanLine[i_y];

ptr2 = (int *)bmp2->ScanLine[i_y];



for ( int i_x = 0; i_x <= bmp2->Width-1; i_x++)

{


if (i_x <=
592)
//DIM image 640 X 480 pb avec ma camera planet




//pas avec axis


if( ptr1[i_x] != ptr2[i_x])

++cpt;

}

}



if(cpt >= seuilDetect)

{

// Encodage( 10 );

AnsiString test = "Mouvement à l'écran de la ";

test += s_nomCadre ;

ShowMessage("je t'ai vue");

jpgCompar->SaveToFile("C:\\Tvue.bmp");

}



ChangerImage(bmp2);



delete bmp2;

delete jpgCompar;



}



//*****************************************************************************

void DetectionMouv::Encodage(int TempsEncodage) // Temps en seconde

{

for(int i =0 ; i>TempsEncodage ; ++i)

{}

}



//*****************************************************************************

void DetectionMouv::ChangerImage(Graphics::TBitmap * NewBmp)

{

jpgCompar = NewBmp;

jpgCompar->SaveToFile("C:\\Camera
1.bmp");
//"C:\"+s_nomCadre+".bmp" // stockage de du
nom du cadre



}



//*****************************************************************************

bool DetectionMouv::IsActivDetect()

{

return b_detect;

}



//*****************************************************************************

Graphics::TBitmap* DetectionMouv::TransformJpegBmp ( TJPEGImage *_p_image)

{

Graphics::TBitmap * bmp2 = new Graphics::TBitmap;



bmp2->Assign(_p_image);

bmp2->PixelFormat = pf4bit;



return bmp2;

}





il me reste a conserver la première image en memoire et éviter ainsi les accés disque.

Amicalement Chasse18
Messages postés
3
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
3 mai 2005

Merci c'est bien gentils. Cependant le projet a été terminé l'an dernier. Pour ceux que ça intéresse, nos profs nous fait faire la chose suivante ( un peu idiote, voire bcp mais bon, on a pas pu discuter avec eux ) : installer un composant graphique qui permet de manipuler les images sous Builder 3.0, intègré dans une fenêtre cachée, qui convertissait sauvegardait les images , appellée de n'importe quel type de fichier en BMP. Biensûr c'est lourd, pas du tout optimisé, et ça multiplie les accès disques car les fonctions de ce composant ne fonctionnait que sur le disque.

Cependant le jury de l'examen a fait une remarque qui te permettrait de rendre plus facile l'optimisation de ton programme : créer un disque dur virtuel, sur lequel tu enregistres tes images.

Pour ce qui est de la solution de garder la première image en mémoire, je pense que c'est pas une super idée, car mettons que le programme fonctionne 8h d'affilée, dans la journée, t'as des fluctuations de lumière assez grandes, qui sont encore plus visibles lorsque tu travailles en Jpg. Nous avions optés pour une comparaison d'images prises l'une à la suite de l'autre, avec un seuil de tolérance pour les fluctuations, et un seuil de tolérance quand à la masse de pixels différents.

Amicalement
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
si tu regarde le code tu veras que pour resterplus simple il te suffit
de récupérer la première image sans la traiter puis tu récupère la
seconde que tu compare et tu la remplace avec la première.

le probleme de ce code (qui marche) c'est qu'au bout 20 images seconde
cala ralentit l'application car elle n'a pas le temps de parcourrir la
matrice de pixel, que la deuxième image est déjà là.

sinon j'ai fait le test de lancer l'encodage en mpeg simultanement la
mémoire rest constant le cpu fait des aller retour entre 100 et 55%
mais acceptable.

si vous avez des idéés pour améliorer je suis preneur.

Chasse18
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
j'ai oublié le disque virtuel je sai créer un disque virtuel et j'ai
essayer cependant étant donner la quantité d'image que me fournissent
les caméras ip et la quantité du disque virtuel (16 Mo).

sa explose

chasse18
Messages postés
3
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
3 mai 2005

Merci pour cette précision. Nous n'avons pas utilisés le composant TBitmap et ses fonctions. Nos profs nous l'ont interdit, en prétextant que le codage devait pouvoir être porté sous n'importe qu'elle plateforme, à part pour le chargement de l'image à l'écran. Pour l'analyse on a donc utilisé deux pointeurs, dans lesquels on stockait deux images, une première, puis la deuxième qui suivait. La comparaison se faisait sur ces deux images, puis prenait l'adresse de la deuxième et on prenait le premier pointeur que l'on faisait pointer vers cette adresse, ce qui évitait de passer par une phase de copie et donnais un gain en temps non négligeable. Pour optimiser, on a étudier une solution que les profs nous ont refusés, mais qui reste très utilisées quand même dans l'industrie. Au lieu de comparer chaque pixel de chaque image, tu peux prendre un pixel tout les X pixels. Ainsi, tu peux faire une sorte de grille plutôt qu'un rectangle plein, si tu vois ce que je veux dire.

Une autre solution pour optimiser serait de faire le md5 d'une ligne, et de le comparer au md5 de la même ligne sur la même image. Ca te permets de limiter le nombre de comparaison également.

Par exemple pour une image ça t'en ferai 480 au lieu de 307200 (dans le cas ou tu compares chaque pixel).
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
je vai regarder ton systeme de md5 en ce qui concerne les ptr, je
t'explique mon pb si tu veus j'ai une classe clEcranVCl qui est en
relation avec la clJpegVcl dans cette classe je manipule des jpeg alors
qu'au dessus de cette classe et dans toutes les autres ( 10 ) je
manipule mes images avec des pointeurs intelligent ce qui permet de ne
pas à avoir à traiter de la destruction de ceux-ci, mon pb est que je
voulais créer mon objet DetectionMouv dans clEcranVcl et passer le ptr
à clJpegVcl qui appelerai les méthodes utile à la detection du
mouvement. Mais je ne sai pas pourquoi il me créé un deuxième objet
DetectionMouv alors que je lui est passé par référence et donc sa
plante, car je ne conserver l'image en mémoire.

j'ai donc opté pour la création dans clJpegVcl et la sauvegarde sur le
disque, mais c'est très bourin et sa me plais oas du tout.

Chasse18
Messages postés
5
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
17 janvier 2006

salut à tous !!!

Alors moi aussi je fais un projet avec une camera Ip axis 2100
C++ et avec C++ builder 5,mon but est d'inclure l'image de la camera Ip
en flux continue dans mon IHM .Si vous avez encore les sources de vos
ancien projet ou si vous pouvez m'aidez se serais très bien!!!

Je vous remercie tous !!please c'est pour mon projet de fin d'année!!
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
Tu recupère le flux Stream de la camera et tu l'affiche dans paintbox ou dans l'objet superieur je sai plus car c'était il y a deux de cela donc faut que je recherche.

chasse18
Messages postés
5
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
17 janvier 2006

je te remercie deja pour ce petit indice et pour la recherche que t'effectue :

voici le bon de code que j'ai commencé (je suis vraiment novice) le problème est que je n'ai pas l'image d'afficher:



void __fastcall TForm1::ClientSocket1Read(TObject *Sender,

TCustomWinSocket *Socket)

{

//événement de lecture : lecture du renvoi du serveur



f = fopen("tampon","w");



while( (n=Socket->ReceiveBuf(recu,5000)) != '\0'){



fwrite(recu,1,n,f);

Total = Total+n;



}

fclose(f);



f = fopen("tampon","r");

//fseek(f, 0L, SEEK_SET) ;

//n=fread(recu,1,50,f) ; recu[n]=0;



fgets(recu,2000,f); taille = taille + strlen(recu) ;

printf("%s",recu);

// for (i=0;i<n;i++)printf("%c\n",recu[i]);

fgets(recu,2000,f);taille = taille + strlen(recu) ;

printf("%s",recu);

fgets(recu,2000,f);taille = taille + strlen(recu) ;

printf("%s",recu);

fgets(recu,2000,f);taille = taille + strlen(recu) ;

printf("%s",recu);

fgets(recu,2000,f);taille = taille + strlen(recu) ;

printf("%s",recu);

fgets(recu,2000,f);taille = taille + strlen(recu) ;

printf("%s",recu);

fgets(recu,2000,f);taille = taille + strlen(recu) ;

printf("%s",recu);

printf("taille = %d \n",taille);

fgets(recu,2000,f);taille = taille + strlen(recu) ;

printf("%s",recu);

printf("taille = %d \n",taille);



p = (unsigned char*)malloc(Total-taille);

fread(p, 1 , Total-taille, f) ;

fclose(f) ;

f = fopen("image.jpg","w");

fwrite(p, 1 , Total-taille, f) ;



fclose(f) ;



S2=Socket->ReceiveText();

S2+=Socket->ReceiveText();

Memo1->Lines->Add(S2);

Memo1->Lines->SaveToFile("tampon");



}

encore Merci d'avance!!
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
C'est plus imple que sa tu connais L' IDHTTP il gere les socket et recupérer des flux.

chasse18
Messages postés
5
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
17 janvier 2006

re Tu ma parler de l'IDHTTP, je connais pas du tout j'ai essayé de faire l'aide de Borland C++ je vois pas en quoi sa consiste.

Sinon je me suis dit si je pouvais pas utiliser des sockets bloquante pour pouvoir récupéré la totalité de l'image.
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
ConnectionVCL::ConnectionVCL( TIdHTTP* _composant_idhttp,
std::string _s_login,
std::string _s_password,
std::string _s_protocol,
std::string _s_ip,
std::string _s_port)
{
//Attributs iConnection
this->s_login = _s_login;
this->s_password = _s_password;
this->s_protocol = _s_protocol;
this->s_ip = _s_ip;
this->s_port = _s_port;

//Attributs VCL
this->id_connection = _composant_idhttp;
this->id_connection->Request->Username = s_login.c_str();
this->id_connection->Request->Password = s_password.c_str();
}
//---------------------------------------------------------------------------
/****************************************************************************
* Constructeur
/****************************************************************************/
ConnectionVCL::ConnectionVCL(TIdHTTP* _composant_idhttp,iDriver* p_driver)
{
//Attributs iConnection
this->s_login = p_driver->GetLogin();
this->s_password = p_driver->GetPassword();
this->s_protocol = p_driver->GetProtocol();
this->s_ip = p_driver->GetIp();
this->s_port = p_driver->GetPort();

//Attributs VCL
this->id_connection = _composant_idhttp;
this->id_connection->Request->Username = s_login.c_str();
this->id_connection->Request->Password = s_password.c_str();
}
//---------------------------------------------------------------------------
/****************************************************************************
* Destructeur
/****************************************************************************/
ConnectionVCL::~ConnectionVCL() {}
//---------------------------------------------------------------------------
/****************************************************************************
* --- Implémentation de l'interface iConnection ---
* Methode abstraite permettant de recupérer un média à partir d'une
* requete sous forme de string
/****************************************************************************/
void ConnectionVCL::MediaRequest(std::string& _s_requete,Media* _p_media)
{
if(_p_media == NULL)
{
throw ErrGenerale("ConnectionVCL::MediaRequest -> Pointeur sur Media NULL");
}
//On créer un stream pour stocker les infos de la requête
StreamVCL* data_stream = new StreamVCL();
//On lance la requete
try
{
id_connection->Get(this->DoRequest(_s_requete).c_str(),data_stream->GetStream());
}
catch(ErrGenerale& e)
{
throw ErrGenerale("ConnectionVCL::MediaRequest -> ErrGenerale = " + e.MessageErr());
}
catch(...)
{
throw ErrGenerale("ConnectionVCL::MediaRequest -> Erreur lors de la demande de media");
}
//On remet au depart du stream
data_stream->ResetPosition();
//On charge l'image à partir du stream dans le média
_p_media->LoadFromStream(data_stream);
//Destruction du stream
if(data_stream != NULL)
delete data_stream;
}
//---------------------------------------------------------------------------
/****************************************************************************
* --- Implémentation de l'interface iConnection ---
* Methode abstraite permettant d'effectuer une action à partir
* d'une requete sous forme de string
/****************************************************************************/
void ConnectionVCL::ActionRequest(std::string& _s_requete)
{
//On créer un stream pour stocker les infos de la requête
StreamVCL* data_stream = new StreamVCL();

//On lance la requete
id_connection->Get(this->DoRequest(_s_requete).c_str(),data_stream->GetStream());
//Destruction du stream
if(data_stream != NULL)
delete data_stream;
}
//---------------------------------------------------------------------------
/***********************************************************************
* Methodes permettant de formater correctement la requete
/**********************************************************************/
std::string ConnectionVCL::DoRequest(const std::string& _s_requete) const
{
return (s_protocol+s_ip+":"+s_port+_s_requete);
}
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
Voila se que j'ai fait pour mon sujet de stage se n'est qu'un extrait
chasse18
Messages postés
5
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
17 janvier 2006

je te remerci pour ce bout de code
Messages postés
5
Date d'inscription
mercredi 11 janvier 2006
Statut
Membre
Dernière intervention
17 janvier 2006

rebonjour,
je revient de nouveau à l'assault lol!!
donc la je suis en cour et on se penche encore sur le sujet de la camera ip avec notre professeur qui lui meme a du mal à trouver car sous windows et borland.
Donc si tu pouvais me mettre sur la piste encore une fois parce que j'ai rien compris au VCL et IDHTTP merci
Messages postés
10
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
6 mai 2006

Bonjour moi aussi j'ai un projet Axis pour affichage jpeg et detection de changement d'image,


Je cale deja sur l'affichage jpeg si vous pouvez m'apporter votre aide et aussi si vous pouvez m'expliquer un peu :d:d

Je ne vois pas comment chercher l'image jpeg directement sur la camera :s
Messages postés
51
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 juin 2005
1
tu peux récupérer l'image jpeg grace au scritp cgi des caméra axis sur le site de axis tu trouvera comment aceder au script ou avec éteral tu fait une requete sur la cam et tu analyse se qu'il ya sur le réseaux(transfere tcp).

chasse18
Messages postés
10
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
6 mai 2006

Merci j'avais pas penser a commencer comme ça ^^



ça vas bien m'aider