RECHERCHER :
COMMUNAUTE MP
Identifiez vous ...
Devenir Membre
J'ai oublié mon MDP
DOMAINE MP
Bavardages
Langages Généraux
Langages Web
Langages DotNet
Autres langages
Dev. Jeux Video
Sécurité
Sys. Exploitation
Graphismes
Logiciels
Réseaux
Bases de données
Méthodologies
Emplois High-tech
Aide juridique
Articles juridiques
FORUM
Index des forums
Ajouter un sujet
Rechercher sujet
Contact Responsable
Devenir modérateur
CHAT MP IRC
Votre pseudo ...
Srv: irc.moteurprog.com
Chan: #MoteurProg
PARTICIPER
Plus de 3500 emplois.
Rechercher un job
Déposez votre CV
Emplois High-tech

Visiteur MP

 enregistrer une SDL_Surface* en PNG

Forum : C++
Sous Catégorie : Aucune
Type du sujet : Sujet Normale
FAQ : FAQ C++

SUIVI DES SUJETS PAR MAIL

SUIVI PAR MAIL INACTIF

RESOLUTION DU SUJET SUJET RESOLU
BLOQUAGE DU SUJET SUJET ACTIF
APPARTENANCE A LA FAQ APPARTENANT A LA FAQ


PAGE : [1]

POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

FORUM C++

PREMIERE PAGE

PAGE PRECEDENTE

Page précedente

Page suivante

PAGE SUIVANTE

DERNIERE PAGE
Spirit
Superviseur :
- C & C++
Modérateur :
- PHP
- Javascript
- MySQL
Avatar de Spirit
Inscrit : 07/04/2004
Messages : 2121
Message
#108360
Posté le 24/08/06 à 02:53
Vous connaissez SDL, SDL_image
vous pouvez charger des PNG en SDL_Surface*, mais ces librairies ne permettent pas le chemin inverse

Voilà 2 fonctions permettant la transformation SDL_Surface* => image PNG


#include <SDL.h> #include <time.h> #include <png.h> #include <string> #include <iostream> using namespace std; Uint32 getPixel(SDL_Surface *surface, int x, int y) { int bpp = surface->format->BytesPerPixel; /* Here p is the address to the pixel we want to retrieve */ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; switch(bpp) { case 1: return *p; case 2: return *(Uint16 *)p; case 3: if(SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2]; else return p[0] | p[1] << 8 | p[2] << 16; case 4: return *(Uint32 *)p; default: return 0; /* shouldn't happen, but avoids warnings */ } } bool saveAsPNG(SDL_Surface* toSave, string fileName) { if(fileName == "") fileName = "screens/" + toString(time(NULL)) + ".png"; FILE* file = fopen(fileName.c_str(), "wb"); if(!file) { cout<<"Impossible d'ouvrir le fichier "<<fileName<<" pour enregistrer le screenshot"<<endl; return false; } png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); if(!png_ptr) { fclose(file); return false; } png_infop png_info = png_create_info_struct(png_ptr); if(!png_info) { png_destroy_write_struct(&png_ptr, &png_info); fclose(file); return false; } if(setjmp(png_ptr->jmpbuf)) { png_destroy_write_struct(&png_ptr, &png_info); fclose(file); return false; } /* données de l'image */ png_init_io(png_ptr, file); // type de compression png_set_compression_level(png_ptr, Z_BEST_SPEED); // infos de l'image png_set_IHDR(png_ptr, png_info, static_cast<png_uint_32>(toSave->w), static_cast<png_uint_32>(toSave->h), 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); // date de création png_time modtime; png_convert_from_time_t(&modtime, time(NULL)); png_set_tIME(png_ptr, png_info, &modtime); // commentaires de l'image png_text text[6]; text[0].key = "Title"; text[0].text = ""; text[0].compression = PNG_TEXT_COMPRESSION_NONE; text[1].key = "Author"; text[1].text = ""; text[1].compression = PNG_TEXT_COMPRESSION_NONE; text[2].key = "Description"; text[2].text = ""; text[2].compression = PNG_TEXT_COMPRESSION_NONE; text[3].key = "Copyright"; text[3].text = ""; text[3].compression = PNG_TEXT_COMPRESSION_NONE; text[4].key = "E-mail"; text[4].text = ""; text[4].compression = PNG_TEXT_COMPRESSION_NONE; text[5].key = "Url"; text[5].text = ""; text[5].compression = PNG_TEXT_COMPRESSION_NONE; png_set_text(png_ptr, png_info, text, 6); /* écriture de l'image */ png_write_info(png_ptr, png_info); png_byte* line; line = new png_byte[toSave->w * 3]; for(int i = 0; i < 480; ++i) { for(int p = 0, j = 0; j < toSave->w; ++j) { // extraction du pixel de la SDL_Surface* Uint32 pixel = getPixel(toSave, j, i); // extraction de chaque composante et écriture du pixel dans la ligne du png line[p++] = pixel>>16; line[p++] = pixel>>8; line[p++] = pixel; } // écriture de la ligne dans le fichier png_write_row(png_ptr, line); } delete[] line; png_write_end(png_ptr, png_info); png_destroy_write_struct(&png_ptr, &png_info); fclose(file); return true; }

__________________________
Spirit - modérateur casu ^-^'

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Publicité
Inscrit : X
Messages : X
Message
#Aucun

HAUT DE PAGE

  

fatma_87
Membre MP
Avatar de fatma_87
Inscrit : 14/02/2007
Messages : 231
Message
#127719
Posté le 20/03/07 à 14:43
merci spirit pour l'info.......mais g pa vraiment compris ni cett biblio ni son utilité ....????SmileySmileySmiley
__________________________
il faut être patient et ambitieux

never give up , let the challenge your way to live

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

rainbow
Superviseur :
- C & C++
Chef de projet(s) :
- IA savane
- Team MoteurProg

Avatar de rainbow
Inscrit : 26/05/2006
Messages : 1470
Message
#164109
Posté le 23/06/09 à 21:38
Wikipedia dit :
Simple DirectMedia Layer (SDL) est une bibliothèque très utilisée dans le monde de la création d'applications multimédias en deux dimensions comme les jeux vidéo, les démos graphiques, les émulateurs, etc ... Sa simplicité, sa flexibilité, sa portabilité et surtout sa licence GNU LGPL contribuent à son grand succès. Elle est de plus considérée comme un outil suffisamment simple, et est souvent conseillée aux programmeurs débutants pour commencer dans le monde de la programmation multimédia.

En gros, SDL c'est pour faire des applications graphiques en 2D du style jeux par exemple.
__________________________
............ Curtis: RTS 3D ..............
......Image
........... TeamMoteurProg...........

How to ask Questions ou Comment poser une question
TPE Rayons X et Scoliose

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE ALLER VOIR SON SITE
POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

PREMIERE PAGE

PAGE PRECEDENTE Page précédente

Page suivante

PAGE SUIVANTE DERNIERE PAGE

FORUM C++



    PAGE : [1]



.: Site Web développé par Yann Pingot et l'équipe MPWG avec www.evolvia-web.com :.