begin process at 2012 02 11 06:14:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Multimédia

 > 

PB avec libpng : png en niveau de gris sur 16 bits


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

PB avec libpng : png en niveau de gris sur 16 bits

lundi 5 mars 2007 à 19:53:44 | PB avec libpng : png en niveau de gris sur 16 bits

ReDcRoWn

Bonjour à tous,

A l'aide de la libpng je cherche à écrire des images au format PNG en niveau de gris sur 16 bits (pas de transparence).

1/ Je voudrais tout d'abord savoir si cela est bien supporté par la librairie (il me semble que oui)

2/ Voici le code que j'utilise :

int ecrirePNG(constchar *nomFichier, short tab[DIM_Y][DIM_X]){/* --- declarations --- */int x, y, n = 0;
	FILE *fic = NULL;
	png_structp png_ptr;
	png_infop info_ptr;
	png_byte buffer[2*DIM_X];
	int i,j;
	/* --- fin declarations --- */
 
	memset(buffer,0,sizeof(buffer));
 
	fic = fopen(nomFichier,"wb");
	if(fic == NULL){return(EXIT_FAILURE);
	}/* on cree une png read struct */
	png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
	if(!png_ptr){
		fclose(fic);
		return(EXIT_FAILURE);
	}/* on cree une png info struct */
	info_ptr = png_create_info_struct(png_ptr);
	if(!info_ptr){
		fclose(fic);
		png_destroy_write_struct(&png_ptr, NULL);
		return(EXIT_FAILURE);
	}
 
	/* on ecrit dans un fichier */
	png_init_io(png_ptr,fic);
 
	/* choix du type de compression */
	png_set_compression_level(png_ptr, Z_NO_COMPRESSION);
      
    	/* infos sur l'image */
	png_set_IHDR(	png_ptr, 
			info_ptr, 
			DIM_X,  	/* largeur image */
			DIM_Y, 	/* hauteur image */16,  		/* profondeur de couleur */
			PNG_COLOR_TYPE_GRAY, 
			PNG_INTERLACE_NONE,
			PNG_COMPRESSION_TYPE_DEFAULT, 
			PNG_FILTER_TYPE_DEFAULT);
 
	png_write_info(png_ptr, info_ptr);
 
	/* on ecrit l'image ligne par ligne */for(y = 0; y < DIM_Y; y++){
		n = 0;
		for(x = 0; x < DIM_X; x++){/*buffer[n] = round( ((double)tab[y][x] - min) / LSB );
			buffer[n+1] = 0;*/
			buffer[n] = tab[y][x];		/* LSB */
			buffer[n+1] = tab[y][x] >> 8;	/* MSB semble non pris en compte */
			n += 2;
		}
 
		png_write_row(png_ptr, buffer);
	}
 
	/* fin ecriture PNG */
	png_write_end(png_ptr, info_ptr); 
 
	/* liberation */
	png_destroy_write_struct(&png_ptr, &info_ptr);
 
	fclose(fic);
 
	return(EXIT_SUCCESS);
}
 
Quelques explications sur le code :
- la fonction "png_write_row" ne prend en second argument que des unsigned char (8 bits) donc il me semble que
le principe pour écrire des unsigned short (16 bits) c'est de passer l'octet LSB du mot 16 bits puis l'octet MSB (cela a pour conséquence de doubler la taille du buffer)
- le code en commentaire dans la double boucle me permet de passer mes images sur 8 bits et dans ce cas c'est OK
(car le MSB est à 0) donc le principe du § précédent me paraît cohérent.

Le problème c'est que le MSB ne semble pas pris en compte, du coup je n'ai pas les résultats voulu.
Toute aide sera la bienvenue, merci d'avance
lundi 5 mars 2007 à 19:58:52 | Re : PB avec libpng : png en niveau de gris sur 16 bits

ReDcRoWn

Je la refais vu que je me suis bien planté dans mon copier coller du code source, désolé...

Bonjour à tous,

A l'aide de la libpng je cherche à écrire des images au format PNG en niveau de gris sur 16 bits (pas de transparence).

1/ Je voudrais tout d'abord savoir si cela est bien supporté par la librairie (il me semble que oui)

2/ Voici le code que j'utilise :

[code]
int ecrirePNG(const char *nomFichier, short tab[DIM_Y][DIM_X])
{
 /* --- declarations --- */
 int x, y, n = 0;
 FILE *fic = NULL;
 png_structp png_ptr;
 png_infop info_ptr;
 png_time  modtime;
 png_text text[4];
 png_byte buffer[2*DIM_X];
 double LSB;
 short min, max;
 int i,j;
 /* --- fin declarations --- */

 memset(buffer,0,sizeof(buffer));

 fic = fopen(nomFichier,"wb");
 if (fic == NULL)
 {
  return (EXIT_FAILURE);
 }
 /* on cree une png read struct */
 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
 if(!png_ptr)
 {
  fclose(fic);
  return(EXIT_FAILURE);
 }
 /* on cree une png info struct */
 info_ptr = png_create_info_struct(png_ptr);
 if(!info_ptr)
 {
  fclose(fic);
  png_destroy_write_struct(&png_ptr, NULL);
  return(EXIT_FAILURE);
 }

 /* on ecrit dans un fichier */
 png_init_io(png_ptr,fic);

 /* type de compression */
 png_set_compression_level(png_ptr, Z_NO_COMPRESSION); /* Z_BEST_SPEED / Z_BEST_COMPRESSION / Z_NO_COMPRESSION */
     
    /* infos de l'image */
 png_set_IHDR( png_ptr,
     info_ptr,
     DIM_X, 
     DIM_Y,
     16, 
     PNG_COLOR_TYPE_GRAY,
     PNG_INTERLACE_NONE,
     PNG_COMPRESSION_TYPE_DEFAULT,
     PNG_FILTER_TYPE_DEFAULT);

 png_write_info(png_ptr, info_ptr);

 /* ecrit l'image ligne par ligne */
 for (y = 0; y < DIM_Y; y++)
 {
  n = 0;
  for (x = 0; x < DIM_X; x++)
  {
   /*buffer[n] = round( ((double)tab[y][x] - min) / LSB );
   buffer[n+1] = 0;*/
   buffer[n] = tab[y][x];
   buffer[n+1] = tab[y][x] >> 8; /* non pris en compte */
   n += 2;
  }

  png_write_row(png_ptr, buffer);
 }

 /* fin ecriture PNG */
 png_write_end(png_ptr, info_ptr);

 /* liberation */
 png_destroy_write_struct(&png_ptr, &info_ptr);

 fclose(fic);

 return (EXIT_SUCCESS);
}
[/code]

Quelques explications sur le code :
- la fonction "png_write_row" ne prend en second argument que des unsigned char (8 bits) donc il me semble que
le principe pour écrire des unsigned short (16 bits) c'est de passer l'octet LSB du mot 16 bits puis l'octet MSB (cela a pour conséquence de doubler la taille du buffer)
- le code en commentaire dans la double boucle me permet de passer mes images sur 8 bits et dans ce cas c'est OK
(car le MSB est à 0) donc le principe du § précédent me paraît cohérent.

Le problème c'est que le MSB ne semble pas pris en compte, du coup je n'ai pas les résultats voulu.
Toute aide sera la bienvenue, merci d'avance

lundi 19 novembre 2007 à 20:04:39 | Re : PB avec libpng : png en niveau de gris sur 16 bits

jguy

Salut!

Je voudrais savoir si tu avais résolu ton problème.
Je suis un peu dans la même situation, je n'arrive pas à lire mes PNG.

Je crois que ça se passe au niveau de la fonction "png_set_gray_to_rgb" située dans "pngwriter.cc" (ligne 1103).
Toutes les fonctions aux alentours cherchent à nous mettre dans le cas ideal d'une image RGB classique (colortype_=2).
Or, une image en niveaux de gris sans gamma a son "colortype_=0"
Cette fonction (
"png_set_gray_to_rgb") devrait donc retourner "colortype_=2" pour pouvoir continuer le processus.

Ce n'est pas mon cas...
Je ne sais pas si une bibliothèque n'est pas inclue,  si le programme, intrinsèquement ne peut pas lire mes images (j'en doute).
Je n'arrive de toute façon pas à localiser cette transformation. Donc si toi ou quelque autre spécialiste des PNG sauraient m'aider...



Cette discussion est classée dans : buffer, ptr, info, bits, png


Répondre à ce message

Sujets en rapport avec ce message

Lire une image PNG libpng [ par shub85 ] Bonjour, je voulais savoir si quelqu'un utilise libpng ou si il l'as utilisé. Je cherche à récupérer mes valeurs pixels d'une image 1280*960 , 16 bits CRC sur un buffer de bits [ par amosan ] Bonjour,Je cherche à calculer un CRC sur un buffer de bits. Les algorithmes que j'ai trouvés fonctionnent sur des buffers d'octets (crc de fichiers, d J'arrive pas à débuger ceci [ par guiguikun ] Cette fonction parse un buffer. Elle renvoit true si le flag est présent et false s'il ne l'est pas.Je ne peux pas utiliser strstr() car le buffer com libpng [ par cleptho ] J'essaie de lire un png en utilisant la DLL officielle ainsi que celle de zlib, et j'ai apparament une erreur dans une fonction de la lib, un access v Octets et masque de bits [ par LaTatadu91 ] Bonjour,Voila j'ai un probleme sur un petit programme qui récupére dans un buffer des octets :  BYTE buffer[255]et je voudrais savoir comment a partir 2octets --> 1 décimal [ par LaTatadu91 ] Bonjour,Je cherche un moyen pour décrypter un buffer contennat des octetsj'arrive parfaitement a le faire octet apr octet mais je me retrouve dans un déclaration et utilisation d'un buffer (pile TCP/IP) [ par aefmaaradji ] Bonjour, je voudrais savoir comment utiliser et declarer un buffer dans le visual c++/cli car j'ai fait une capture TCP/IP (sniffing) es problème avec un socket bloquant [ par Space_Monkey ] Bonjour,Après une journée de recherches, je ne suis pas parvenu à identifier clairement mon problème, j'ai donc décider de poster.J'utilise depuis lon Salut [ par Joky ] Salut tout le monde ;)J'voulais juste vous passez un ptit bonjour parce que vous avez pu remarquer que je ne suis plus trop présent sur ce site, pour RESEAU PAR SOCKET EN C [ par aziatedu13 ] bonjour,je veux faire un truk extremement simple pour certain, mais assez très difficile pour moi..voila je souhaiterai pouvoir afficher dans une cons


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,340 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales