Accueil > > > MONPPM : UN AFFICHEUR .PPM
MONPPM : UN AFFICHEUR .PPM
Information sur la source
Description
J'ai un logiciel qui calcule en .ppm des images. Il y a une information sur les formats ppm (Portable Pixel Map) à : http://netpbm.sourceforge.net/doc/ppm.html - J'ai donc eu l'envie de faire un afficheur de fichiers *.ppm qui soit très facile à installer et utiliser. Je souhaitais éviter les installeurs et les logiciels complexes qu'il faut étudier longtemps avant de s'en servir. - Pour cela, j'ai développé MonPPM qui affiche des fichiers *.ppm ayant le magic number : P6 et 256 niveaux pour les valeurs RGB des pixels. Ce qui est un type assez courant. - Il y a plusieurs façons de désigner le fichier image à afficher : Fichier => Ouvrir, <ctrl>O, la touche : N et le glisser-déposer du fichier dans la fenêtre adapté de : http://www.gametutorials.com/gtstore/pc-335-9-dra g-and-drop.aspx - La touche F1 donne l'aide. Le source est commenté. - La proportion largeur/hauteur de l'image est conservée quand on modifie les dimensions de la fenêtre avec la souris, et de même en cas d'utilisation du bouton : agrandir la fenêtre. - Les tailles maximale et minimale de la fenêtre sont prises en compte, y compris si l'image a plus de pixels que l'écran. - Si on associe MonPPM et le type .ppm, on peut afficher l'image : . soit par un glisser-déposer du fichier sur le nom de l'exécutable, . soit par un double clic sur le nom du fichier.
Source
- #include "main.h"
-
- // variables communes :
-
- char monprojet[] = "MonPPM v 0.7";
- char nomModel[300]; // nom complet du fichier *.ppm à afficher
- int larg; // largeur de l'image
- int haut; // hauteur de l'image
- int lsup=10; // supplément de largeur entre la fenêtre et l'image ( 2 marges )
- int hsup=74; // supplément expérimental de hauteur entre la fenêtre et l'image
- int hbet; // hauteur de barre d'état
- UCHAR *ucpBitsMem; // les pixels BGRA de l'image
- int cx,cy,xe,ye; // largeur et hauteur de la fenêtre et de l'écran
- int prem; // prem : 1 pour le premier affichage et 0 ensuite
- int zoom; // zoom : 1 ( éch. 1 ) ou 2 ( éch. 1/2 ) ou 4 ( éch. 1/4 )
- int nmax; // nombre d'images qui se suivent en fenêtre maximisée
- int faire; // variable d'état pour readPPM : -1, 0, 1 ou 2
- char buf[600]; // un buffer de travail réutilisable
-
- HINSTANCE hinst;
- HWND hWnd,hEdit,hBe;
- HDC hDC,hdcMem;
- HBITMAP hBmpMem;
-
- void rer(int n) {
- char buf1[]="Problème n° ";
- char buf2[]=" dans la lecture du fichier : \n\n";
- char bb[3];
- strcpy(buf,buf1); // on signale un problème
- sprintf(bb,"%i",n); // intervenu dans readPPM
- strcat(buf,bb); // pendant la lecture du fichier .ppm
- strcat(buf,buf2);
- strcat(buf,nomModel);
- informer(buf);
- faire = -1; // pour traiter l'erreur de lecture
- return;
- }
-
- void readPPM(char *szFileName, UCHAR **ucpBits, int *iWidth, int *iHeight) {
- FILE *fi;
- unsigned int w, h, d; // ici on lit le fichier *.ppm de l'image
- char *t,*ptr;
- long fisize;
- int r,n;
- fi = fopen(szFileName, "r");
- if ( fi == NULL ) {rer(1); return;}
- t = fgets(buf, 100, fi);
- if ( (t == NULL) || ( strncmp(buf, "P6", 2) != 0 ) ) {rer(2); return;}
- if(buf[2] == '\n') {
- t = fgets(buf, 100, fi); // cas général : P6\n
- ptr=&buf[0];
- }
- else ptr=&buf[2]; // si le '\n' est omis
- while(strncmp(ptr, "#", 1) == 0 ) { // si commentaires
- t = fgets(buf, 100, fi);
- ptr=&buf[0];
- }
- while(strncmp(ptr, "\n", 1) == 0 ) { // si ici : '\n'
- t = fgets(buf, 100, fi);
- ptr=&buf[0];
- }
- d = 0;
- w = strtol(ptr, &ptr, 0);
- h = strtol(ptr, &ptr, 0);
- d = strtol(ptr, &ptr, 0); // lecture de d : nb de niveaux
- if( d!= 255 ) {
- t = fgets(buf, 100, fi);
- d = strtol(buf, &ptr, 0); // si nécessaire, dans la ligne suivante
- }
- if ( d != 255 ) {rer(3); return;} // on se restreint à d = 255 !
- n=3*w*h; // n : nombre d'octets pour les pixels en RGB
- *ucpBits=(UCHAR *)malloc(n*sizeof(UCHAR)); // mémore des pixels en RGB
- fseek(fi, 0, SEEK_END);
- fisize = ftell(fi); // nombre total d'octets du fichier
- fseek(fi, fisize-n, SEEK_SET); // on va lire les n derniers octets
- r=fread(*ucpBits, sizeof(UCHAR), n, fi);
- if(r == 0) {rer(4); return;}
- fclose(fi);
- *iWidth=(int)w; // largeur et
- *iHeight=(int)h; // hauteur de l'image
- return;
- }
-
- void newModel() { // à chaque fois que l'on souhaite charger une nouvelle image
- UCHAR *pix=0;
- int i,j;
- if( openModel() ) {
- DeleteObject(hBmpMem);
- ReleaseDC(hWnd,hdcMem);
- free(ucpBitsMem);
- ucpBitsMem = 0;
- readPPM(nomModel, &pix, &larg, &haut);
- if(faire == -1) {
- free(pix);
- pix = 0;
- newModel(); // ça c'est osé ! mais ici ça marche !
- return;
- }
- ucpBitsMem = (UCHAR*)malloc(4*larg*haut);
- for(i=0,j=0;i<larg*haut*3;i+=3,j+=4) {
- ucpBitsMem[j]=pix[i+2];
- ucpBitsMem[j+1]=pix[i+1]; // rangement des données dans une
- ucpBitsMem[j+2]=pix[i]; // bonne structure : W*H*4 ( B G R A )
- ucpBitsMem[j+3]=(UCHAR)0;
- }
- free(pix);
- pix = 0;
- hdcMem = CreateCompatibleDC(NULL); // création d'un bitmap
- hBmpMem = CreateBitmap(larg,haut,1,32,ucpBitsMem);
- SelectObject(hdcMem,hBmpMem);
- if(prem != 0) {
- prem = 0; // ici on prépare le cas particulier du
- i = mini(lmax(),lsup+larg/zoom); // premier affichage de la première image
- j = mini(hmax(),hsup+haut/zoom);
- SetWindowPos(hWnd,0,0,0,i,j,SWP_NOZORDER|SWP_NOMOVE);
- }
- else SetWindowPos(hWnd,0,0,0,lsup+larg/zoom,hsup+haut/zoom,SWP_NOZORDER|SWP_NOMOVE);
- guidage();
- model();
- faire=2; // ici la préparation de l'image s'est bien terminée
- }
- InvalidateRect(hWnd, NULL, TRUE);
- return;
- }
-
-
-
- //
- // Pour le reste du source voir dans le zip
- //
#include "main.h"
// variables communes :
char monprojet[] = "MonPPM v 0.7";
char nomModel[300]; // nom complet du fichier *.ppm à afficher
int larg; // largeur de l'image
int haut; // hauteur de l'image
int lsup=10; // supplément de largeur entre la fenêtre et l'image ( 2 marges )
int hsup=74; // supplément expérimental de hauteur entre la fenêtre et l'image
int hbet; // hauteur de barre d'état
UCHAR *ucpBitsMem; // les pixels BGRA de l'image
int cx,cy,xe,ye; // largeur et hauteur de la fenêtre et de l'écran
int prem; // prem : 1 pour le premier affichage et 0 ensuite
int zoom; // zoom : 1 ( éch. 1 ) ou 2 ( éch. 1/2 ) ou 4 ( éch. 1/4 )
int nmax; // nombre d'images qui se suivent en fenêtre maximisée
int faire; // variable d'état pour readPPM : -1, 0, 1 ou 2
char buf[600]; // un buffer de travail réutilisable
HINSTANCE hinst;
HWND hWnd,hEdit,hBe;
HDC hDC,hdcMem;
HBITMAP hBmpMem;
void rer(int n) {
char buf1[]="Problème n° ";
char buf2[]=" dans la lecture du fichier : \n\n";
char bb[3];
strcpy(buf,buf1); // on signale un problème
sprintf(bb,"%i",n); // intervenu dans readPPM
strcat(buf,bb); // pendant la lecture du fichier .ppm
strcat(buf,buf2);
strcat(buf,nomModel);
informer(buf);
faire = -1; // pour traiter l'erreur de lecture
return;
}
void readPPM(char *szFileName, UCHAR **ucpBits, int *iWidth, int *iHeight) {
FILE *fi;
unsigned int w, h, d; // ici on lit le fichier *.ppm de l'image
char *t,*ptr;
long fisize;
int r,n;
fi = fopen(szFileName, "r");
if ( fi == NULL ) {rer(1); return;}
t = fgets(buf, 100, fi);
if ( (t == NULL) || ( strncmp(buf, "P6", 2) != 0 ) ) {rer(2); return;}
if(buf[2] == '\n') {
t = fgets(buf, 100, fi); // cas général : P6\n
ptr=&buf[0];
}
else ptr=&buf[2]; // si le '\n' est omis
while(strncmp(ptr, "#", 1) == 0 ) { // si commentaires
t = fgets(buf, 100, fi);
ptr=&buf[0];
}
while(strncmp(ptr, "\n", 1) == 0 ) { // si ici : '\n'
t = fgets(buf, 100, fi);
ptr=&buf[0];
}
d = 0;
w = strtol(ptr, &ptr, 0);
h = strtol(ptr, &ptr, 0);
d = strtol(ptr, &ptr, 0); // lecture de d : nb de niveaux
if( d!= 255 ) {
t = fgets(buf, 100, fi);
d = strtol(buf, &ptr, 0); // si nécessaire, dans la ligne suivante
}
if ( d != 255 ) {rer(3); return;} // on se restreint à d = 255 !
n=3*w*h; // n : nombre d'octets pour les pixels en RGB
*ucpBits=(UCHAR *)malloc(n*sizeof(UCHAR)); // mémore des pixels en RGB
fseek(fi, 0, SEEK_END);
fisize = ftell(fi); // nombre total d'octets du fichier
fseek(fi, fisize-n, SEEK_SET); // on va lire les n derniers octets
r=fread(*ucpBits, sizeof(UCHAR), n, fi);
if(r == 0) {rer(4); return;}
fclose(fi);
*iWidth=(int)w; // largeur et
*iHeight=(int)h; // hauteur de l'image
return;
}
void newModel() { // à chaque fois que l'on souhaite charger une nouvelle image
UCHAR *pix=0;
int i,j;
if( openModel() ) {
DeleteObject(hBmpMem);
ReleaseDC(hWnd,hdcMem);
free(ucpBitsMem);
ucpBitsMem = 0;
readPPM(nomModel, &pix, &larg, &haut);
if(faire == -1) {
free(pix);
pix = 0;
newModel(); // ça c'est osé ! mais ici ça marche !
return;
}
ucpBitsMem = (UCHAR*)malloc(4*larg*haut);
for(i=0,j=0;i<larg*haut*3;i+=3,j+=4) {
ucpBitsMem[j]=pix[i+2];
ucpBitsMem[j+1]=pix[i+1]; // rangement des données dans une
ucpBitsMem[j+2]=pix[i]; // bonne structure : W*H*4 ( B G R A )
ucpBitsMem[j+3]=(UCHAR)0;
}
free(pix);
pix = 0;
hdcMem = CreateCompatibleDC(NULL); // création d'un bitmap
hBmpMem = CreateBitmap(larg,haut,1,32,ucpBitsMem);
SelectObject(hdcMem,hBmpMem);
if(prem != 0) {
prem = 0; // ici on prépare le cas particulier du
i = mini(lmax(),lsup+larg/zoom); // premier affichage de la première image
j = mini(hmax(),hsup+haut/zoom);
SetWindowPos(hWnd,0,0,0,i,j,SWP_NOZORDER|SWP_NOMOVE);
}
else SetWindowPos(hWnd,0,0,0,lsup+larg/zoom,hsup+haut/zoom,SWP_NOZORDER|SWP_NOMOVE);
guidage();
model();
faire=2; // ici la préparation de l'image s'est bien terminée
}
InvalidateRect(hWnd, NULL, TRUE);
return;
}
//
// Pour le reste du source voir dans le zip
//
Conclusion
On peut bien sûr l'étendre à d'autres types de fichiers d'images et/ou développer des fonctionalités supplémentaires, ce n'était pas l'objectif et de toutes façons, l'excellent et gratuit PhotoFiltre est bien mieux. Toutes vos remarques sont les bienvenues. pgl10.
Historique
- 22 février 2010 09:28:37 :
- correction de laprésentation
- 23 février 2010 17:56:38 :
- Version 0.3 nouvelle ( voir ci-après )
- 27 février 2010 13:12:09 :
- La v0.4 est encore mieux ( voir ci-après )
- 27 février 2010 19:08:23 :
- La description avait une erreur.
- 28 février 2010 16:53:42 :
- La v0.5 ajoute le traitement de l'association des *.ppm
- 02 mars 2010 13:16:51 :
- La version 0.6 supprime le scintillement ( voir ci-après)
- 09 mars 2010 17:30:04 :
- Version 0.7 : plusieurs améliorations ( voir ci-après )
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
OpenGl:Prob de textures PPM [ par Florian29 ]
Salut!Voilà j'ai un problème avec les images ppm pour mes programmes openGl. J'ai développé des programme à la fac qui utilisent des textures ppm. Che
animer des images JPG [ par popi0016 ]
Posté le: Jeu Oct 21, 2004 0:56 Sujet du message: Animer des images JPG -----------------------------------------------------------------------
superposer des images en opengl/glut [ par gimli123 ]
Bonjour, est-il possible de superposer de .tga ?Et au faite, en passant, comment doit-on faire pour que les images bouges en translation ? si oui comm
liste d'images [ par maigmoc ]
salut;j'aimerai créer une liste d'images et ensuite prendre des images(jpeg) d'un repertoire et les mémorisé dans cette liste.merci a+
Urgent manipulation d'images et text [ par bilal ]
salut,voila je suis sur un projet que je dois absolument terminer au plus vide mais g un obstacle , je travail sur c++ builderet je voudrai savoir co
comparaison images [ par maigmoc ]
salut à tous;je cherche à faire une comparaison entre 2 images pixels par pixels dans l'objectif de détecter des mouvements.je travail en visual c++ m
exploitation d'image issues de 2 webcams [ par sofbboy ]
Bonjour a tous.Je débute un peu dans le traitement video en C++ et j'ai un petit probleme...Je voudrais récupérer les images de 2 webcams pour ensuite
Creer une ressource avec Borland builder6 [ par popi0016 ]
Bonjours je voudrais associer a mon .exe des images (bmp ou jpeg) et aimerai savoir comment creer une ressource avec toutes mes images (60 environs) s
Ecran ne rafraichi pas les images [ par smilandfly ]
BonjourJe devellope un demineur sous mfc.J'utilise des BitmapButton qui sont créés dynamiquements.Losrque que l'on clik sur un, il doit changer l'imag
toolbar avec des images [ par sajid_morad ]
salut , j aimerai bien savoir comment charger ma toolbar avec des images bmp, Merci
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|