Page 1 sur 2

Convertir une image jpg, bmp, gif en png dans un upload

Posté : 28 févr. 2012, 03:28
par nico44530
Bonjour,

J'ai un script d'upload qui affiche l'avatar de mes membres, mais si un membre envoi un fichier avec extension : .gif, .jpg, etc...
l'avatar ne s'affichera pas.
Je souhaiterais donc convertir cet avatar uploadé qui serais en .jpg en .png, je préfère des avatars en png :wink:

Est-ce possible avec la librairie GD ? et est-il possible de l'inclure dans le script de l'upload ?
Si oui, expliqué moi bien, parce que je sens que c'est compliqué ce machin là ! 8-|

J'envois le script d'upload
<?php 
session_start();
require("../config.php");

$sql = connect_sql();
$pseudo_membre = $_SESSION['pseudo'];
$requete = mysql_query("SELECT id FROM admin_communaute WHERE `pseudo`='$pseudo_membre'"); 
$result = mysql_fetch_array ($requete);
$id = $result['id'];

/************************************************************
 * Definition des constantes / tableaux et variables *
 ************************************************************/ 

// Constantes
define('TARGET', 'upload/');    // Repertoire cible
define('MAX_SIZE', 100000);    // Taille max en octets du fichier
define('WIDTH_MAX', 800);    // Largeur max de l'image en pixels
define('HEIGHT_MAX', 800);    // Hauteur max de l'image en pixels 

// Tableaux de donnees
$tabExt = array('jpg','gif','png','jpeg');    // Extensions autorisees
$infosImg = array(); 

// Variables
$extension = '';
$message = '';
$nomImage = '';

/************************************************************
 * Creation du repertoire cible si inexistant *
 ************************************************************/
if( !is_dir(TARGET) ) {
  if( !mkdir(TARGET, 0755) ) {
  exit('Erreur : le répertoire cible ne peut-être créé ! Vérifiez que vous diposiez des droits suffisants pour le faire ou créez le manuellement !');  
  }
} 

/************************************************************ 
 * Script d'upload *
 ************************************************************/
if(!empty($_POST)){
  // On verifie si le champ est rempli
  if( !empty($_FILES['fichier']['name']) )
  {
  // Recuperation de l'extension du fichier
  $extension  = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION);
  // On verifie l'extension du fichier
  if(in_array(strtolower($extension),$tabExt))
  {
  // On recupere les dimensions du fichier
  $infosImg = getimagesize($_FILES['fichier']['tmp_name']);
  // On verifie le type de l'image
  if($infosImg[2] >= 1 && $infosImg[2] <= 14)
  {
  // On verifie les dimensions et taille de l'image
  if(($infosImg[0] <= WIDTH_MAX) && ($infosImg[1] <= HEIGHT_MAX) && (filesize($_FILES['fichier']['tmp_name']) <= MAX_SIZE))
  {
  // Parcours du tableau d'erreurs
  if(isset($_FILES['fichier']['error'])
  && UPLOAD_ERR_OK === $_FILES['fichier']['error'])
  {
  // On renomme le fichier
  $nomImage = $id .'.'. $extension;
  // Si c'est OK, on teste l'upload
  if(move_uploaded_file($_FILES['fichier']['tmp_name'], TARGET.$nomImage))
  {
  header('Location: index.php');
  }
  else
  {
  // Sinon on affiche une erreur systeme
  $message = 'Problème lors de l\'upload !';
  }
  }
  else
  {
  $message = 'Une erreur interne a empêché l\'uplaod de l\'image';
  }
  }
  else
  {
  // Sinon erreur sur les dimensions et taille de l'image
  $message = 'Erreur dans les dimensions de l\'image !';
  }
  }
  else
  {
  // Sinon erreur sur le type de l'image
  $message = 'Le fichier à uploader n\'est pas une image !';
  }
  }
  else
  {
  // Sinon on affiche une erreur pour l'extension
  $message = 'L\'extension du fichier est incorrecte !';
  }
  }
  else
  {
  // Sinon on affiche une erreur pour le champ vide
  $message = 'Veuillez remplir le formulaire svp !';
  }
  }
?>
Merci par avance ! :D

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 28 févr. 2012, 11:16
par moogli
salut,

c'est possible avec GD => http://www.lephpfacile.com/cours/22-la-librairie-gd

si tu enregistre le nom du fichier (un nom spécifique c'est pas un soucis) en base tu n'aura ce problème.

@+

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 28 févr. 2012, 15:49
par nico44530
Tu saurais pas comment m'expliquer en détail pour mon cas ? STP :cry:

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 28 févr. 2012, 16:33
par moogli
essai d'abord, c'est simple, quand tu a l'image du la traite (je te conseil de faire une fonction pour alléger le code).

donc à la place du header (enfin avant).

pour les tests le header est a mettre en commentaire.

@+

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 28 févr. 2012, 21:09
par nico44530
Donc je fais comme ca :
<?php 
session_start();
require("../config.php");

$sql = connect_sql();
$pseudo_membre = $_SESSION['pseudo'];
$requete = mysql_query("SELECT id FROM admin_communaute WHERE `pseudo`='$pseudo_membre'");
$result = mysql_fetch_array ($requete);
$id = $result['id'];

/************************************************************
 * Definition des constantes / tableaux et variables *
 ************************************************************/

// Constantes
define('TARGET', 'upload/');    // Repertoire cible
define('MAX_SIZE', 100000);    // Taille max en octets du fichier
define('WIDTH_MAX', 800);    // Largeur max de l'image en pixels
define('HEIGHT_MAX', 800);    // Hauteur max de l'image en pixels

// Tableaux de donnees
$tabExt = array('jpg','gif','png','jpeg');    // Extensions autorisees
$infosImg = array();

// Variables
$extension = '';
$message = '';
$nomImage = '';

/************************************************************
 * Creation du repertoire cible si inexistant *
 ************************************************************/
if( !is_dir(TARGET) ) {
  if( !mkdir(TARGET, 0755) ) {
  exit('Erreur : le répertoire cible ne peut-être créé ! Vérifiez que vous diposiez des droits suffisants pour le faire ou créez le manuellement !');  
  }
}

/************************************************************
 * Script d'upload *
 ************************************************************/
if(!empty($_POST)){
  // On verifie si le champ est rempli
  if( !empty($_FILES['fichier']['name']) )
  {
  // Recuperation de l'extension du fichier
  $extension  = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION);
  // On verifie l'extension du fichier
  if(in_array(strtolower($extension),$tabExt))
  {
  // On recupere les dimensions du fichier
  $infosImg = getimagesize($_FILES['fichier']['tmp_name']);
  // On verifie le type de l'image
  if($infosImg[2] >= 1 && $infosImg[2] <= 14)
  {
  // On verifie les dimensions et taille de l'image
  if(($infosImg[0] <= WIDTH_MAX) && ($infosImg[1] <= HEIGHT_MAX) && (filesize($_FILES['fichier']['tmp_name']) <= MAX_SIZE))
  {
  // Parcours du tableau d'erreurs
  if(isset($_FILES['fichier']['error'])
  && UPLOAD_ERR_OK === $_FILES['fichier']['error'])
  {
  // On renomme le fichier
  $nomImage = $id .'.'. $extension;
  header ("Content-type: image/png"); // Type png
  ImagePng ($image); // Je crée l'image
  // Si c'est OK, on teste l'upload
  if(move_uploaded_file($_FILES['fichier']['tmp_name'], TARGET.$nomImage))
  {
  header('Location: index.php');
  }
  else
  {
  // Sinon on affiche une erreur systeme
  $message = 'Problème lors de l\'upload !';
  }
  }
  else
  {
  $message = 'Une erreur interne a empêché l\'uplaod de l\'image';
  }
  }
  else
  {
  // Sinon erreur sur les dimensions et taille de l'image
  $message = 'Erreur dans les dimensions de l\'image !';
  }
  }
  else
  {
  // Sinon erreur sur le type de l'image
  $message = 'Le fichier à uploader n\'est pas une image !';
  }
  }
  else
  {
  // Sinon on affiche une erreur pour l'extension
  $message = 'L\'extension du fichier est incorrecte !';
  }
  }
  else
  {
  // Sinon on affiche une erreur pour le champ vide
  $message = 'Veuillez remplir le formulaire svp !';
  }
  }
?>
Mais j'ai rien compris dans le tuto :

Je veux pas créer d'image, je veux juste transformer un jpg... en png
Dans le tuto le format de l'image est en php

:cry: Je comprend pas tout :(

Au pire explique moi un script de conversion d'extension d'image avant d'upload sur le serveur :D please !

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 28 févr. 2012, 22:59
par sirakawa
Rien compris non plus au rôle de GD là-dedans.
J'aurais aime me débarraser de Imagemagick en ligne de commande, (via system() ou exec())
imagemegick convert... dont l'inconvénient est d'être lié à la plateforme...
Rien vu sur convert dans la bibliothèque Imagemagick de PHP d'où la solution que j'emploie...

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 29 févr. 2012, 12:16
par Mazarini
J'ai vu dans la doc qu'il est possible de créer une image à partir d'un fichier (gif, jpeg...) et de l'envoyer au navigateur au format png. Par contre, je n'ai pas trouvé comment sauvegarder l'image via php. Peut être en utilisant le buffering (fonctions ob_*).

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 29 févr. 2012, 15:16
par moogli
1/ création d'un ressource image (imagecreatefromtruc (ou truc correspond au format de l'image)
2/ enregistrement en png ImagePng en utilisant les deux arguments

Je ne vois vraiment pas pourquoi tu veux faire ça, y a pas d'intérêt, autant gérer l'affichage, c'est trop limiter la ^^

@+

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 29 févr. 2012, 16:03
par sirakawa
Si tu ne vois pas l'intérêt d'utiliser un format libre, libre pour toi... Mais relis les licences des autres formats... et explique-moi pourquoi certains formats (le .gif, au moins) sont exclus, par exemple, de Savanah...
Non compris les différences de tailles et de performances...

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 29 févr. 2012, 16:38
par Mazarini
...ImagePng en utilisant les deux arguments...
Effectivement, j'avais lu en diagonal, j'aurai appris un truc aujourd'hui.
La combinaison imagecreatefromTruc() + imagepng() me semble bien.
Au passage getimagesize() ou exif_imagetype() permettent de connaitre le type de fichier image.

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 29 févr. 2012, 21:32
par moogli
Problème de licence d'un format ?
Si on s'arrête autant pas se faire chier il va devoir valider les trucs à la main pour savoir s'il n'y pas de droit sur l'image (quelque soit le format de l'image) étant donné que c'est chose au moins aussi importante.

D'ailleurs pourquoi mettre des images ça sert à rien ^^

Je pense pas que le problème d'origine soit un problème de licence fumeuse ou non mais il problème d'incompréhension de ce qui est ou pas réalisable (enfin c'est ce qu'il ressort des réponses).

Peut être que regarderais un jour les licences sur les formats d'image. Ça m'amuserais de voir qui en tiens compte (hors mis ton exemple que je ne connais pas ^^).

Bref il fait comme il veux mais a mon avis le plus simple sera le mieux !


@+

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 29 févr. 2012, 21:38
par sirakawa
Il serait bien que le manuel officiel soit mis à jour:
Cette lecture:
Pour activer le support de GD, vous devez compiler PHP avec l'option --with-gd[=DIR] , où DIR est le dossier d'installation de GD. Il est recommandé d'utiliser la version de GD qui est distribuée avec PHP, en utilisant simplement l'option --with-gd . La bibliothèque GD requiert libpng et libjpeg pour compiler.
m'avait conduit à penser qu'une application portable incluant la bibliothèque GD était impossible.
Or, d'après les contributions, il semblerait qu'il existe mainenant un PHP incluant GD au moins sous CENTOS et Debian.
Il serait intéressant d'en savoir plus sur ce point: autres distributions, autres systèmes...

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 29 févr. 2012, 21:52
par sirakawa
http://www.w3.org/Graphics/PNG/ :
PNG is an extensible file format for the lossless, portable, well-compressed storage of raster images. PNG provides a patent-free replacement for GIF and can also replace many common uses of TIFF. Indexed-color, grayscale, and truecolor images are supported, plus an optional alpha channel for transparency. Sample depths range from 1 to 16 bits per component (up to 48bit images for RGB, or 64bit for RGBA).
Si ça ne suffit pas à expliquer le choix de png!
Quant à savannah, c'est une forge libre GNU, rien de moins, rien de plus...
http://savannah.gnu.org/

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 29 févr. 2012, 22:47
par nico44530
Ou alors il y a une autre alternative à la conversion d'images, c'est d'accepter tous les formats d'images dans l'upload.
Mais ça va prendre beaucoup de place sur le serveur ? (J'ai que 30 Go dans mon espace disque)
Comment fait Facebook pour que la majorité de ses images soient des jpg ?
Il doit les convertir... ?

Je voudrais des avis sur la première question s'il vous plais :wink:

Merci :roll:

Re: Convertir une image jpg, bmp, gif en png dans un upload

Posté : 01 mars 2012, 09:49
par sirakawa
Je crois que voici des éléments de réponse:
Le jpg n'est pas plus gourmand que le png.
les jpg sont souvent plus légères que les png mais elles ne supportent pas la transparence.
la même image http://www.libpng.org/pub/png/img_png/IceAlpha.png
en png 1.7Mo, en jpg: 114.5 Ko, en gif 197Ko
Un conseil des auteurs :
(Note that for transmission of finished truecolor images--especially photographic ones--JPEG is almost always a better choice. Although JPEG's lossy compression can introduce visible artifacts, these can be minimized, and the savings in file size even at high quality levels is much better than is generally possible with a lossless format like PNG. And for black-and-white images, particularly of text or drawings, TIFF's Group 4 fax compression or the JBIG format are often far better than 1-bit grayscale PNG.)