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

Eléphant du PHP | 386 Messages

28 févr. 2012, 03:28

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 févr. 2012, 11:16

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.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 386 Messages

28 févr. 2012, 15:49

Tu saurais pas comment m'expliquer en détail pour mon cas ? STP :cry:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 févr. 2012, 16:33

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.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 386 Messages

28 févr. 2012, 21:09

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 !

Mammouth du PHP | 2278 Messages

28 févr. 2012, 22:59

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...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

29 févr. 2012, 12:16

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_*).

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 févr. 2012, 15:16

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 ^^

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

29 févr. 2012, 16:03

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...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

29 févr. 2012, 16:38

...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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 févr. 2012, 21:32

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 !


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

29 févr. 2012, 21:38

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...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 2278 Messages

29 févr. 2012, 21:52

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/
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 386 Messages

29 févr. 2012, 22:47

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:

Mammouth du PHP | 2278 Messages

01 mars 2012, 09:49

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.)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD