Rogner des photos en PHP !

Bonjour à tous,

J'ai un petit problème,
Il y a des personnes qui upload des photos sur un site web, mais le format de ces photos est très variable, hors je voudrais que ces photos soit carrées. J'aurais donc besoin d'un code PHP qui modifie les photos en rognant les parties en trop, comme sur l'image suivante:

http://image.noelshack.com/fichiers/2014/23/1401904703-image35.png

On imagine que la photo se trouve à l'adresse http://siteweb.com/temp/123.png (c'est un exemple)

Si au passage le script pouvait baisser la qualité des images pour éviter qu'elles soit trop lourdes ça serait vraiment super ^^

Si je demande ce code c'est que je n'ai pas la moindre idée de comment le faire en PHP !

Un très grand merci d'avance ;-)

4 réponses

  1. Contributeur
    'lut, t'as quoi à ta disposition? GD, ImageMagick?
    1. Je ne peux pas te dire précisément mais je pense avoir une très grand partie des options de gestions d'image que php propose ^^
    2. Contributeur
      Avec ImageMagick:
      $size = 128; // pixels, taille finale
      
      $image = new Imagick('image.jpg'); // Adapte pour charger le fichier voulu
      $w = $image->getImageWidth();
      $h = $image->getImageHeight();
      $s = ($w > $h) ? $h : $w;
      $image->cropImage($s, $s, ($w-$s)/2, ($h-$s)/2);
      $image->resizeImage($size, $size, imagick::FILTER_QUADRATIC, 1);
      $image->writeImage('image_thumb.jpg');
      

      Pas testé mais ça devrait marcher.
    3. Merci beaucoup... mais il semble que je n'ai pas ImageMagick, je vais voir pour l'installer mais si non il y a d'autres méthodes sans ImageMagick (si je n'arrive pas à l'installer) ?

      PS: Je crois que j'ai trouvé la liste des extensions php que j'ai actuellement:

      Archive_Tar 1.3.11
      Cache_Lite 1.7.15
      Config 1.10.12
      Console_Getopt 1.3.1
      DB 1.7.14
      DB_DataObject 1.11.2
      DB_NestedSet 1.4.1
      Date 1.4.7
      File 1.4.1
      File_CSV
      File_Util
      HTML_AJAX
      HTML_Common 1.2.5
      HTML_Common2
      HTML_Javascript
      HTML_QuickForm
      HTML_QuickForm2
      HTML_QuickForm_Controller 1.0.10
      HTML_Template_Flexy 1.3.12
      Image_Text 0.7.0
      Log 1.12.7
      MDB2 2.5.0b5
      MDB2_Driver_mysql 1.4.1
      Mail 1.2.0
      Mail_Mime 1.8.8
      Math_BigInteger 1.0.2
      Net_DNS 1.0.7
      Net_DNS2 1.3.2
      Net_SMTP 1.6.2
      Net_Socket 1.0.14
      Net_URL 1.0.15
      Net_URL2 2.0.5
      Net_UserAgent_Detect 2.5.2
      Numbers_Words 0.16.4
      PEAR 1.9.4
      Pager 2.4.8
      RVSeagullMod 1.0.1
      Structures_Graph 1.0.4
      Text_CAPTCHA 0.5.0
      Text_Figlet 1.0.2
      Text_Password 1.1.1
      Translation2 2.0.4
      Validate 0.8.5
      XML_Parser 1.3.4
      XML_RPC 1.5.5
      XML_Util 1.2.1
    4. Contributeur
      Mince, ni GD ni ImageMagick dans le tas...
    5. Modérateur
      Salut

      Sur quel genre de serveur est hébergé ton site ?
  2. Regarde ici:

    http://stackoverflow.com/questions/14799311/resize-and-crop-image-into-square-with-white-background-using-gd
    1. Bonjour,

      tout d'abord tu peux utiliser la prog en poo en php !

      tu aura besoin d' :

      un fichier class en php (la poo),
      un formulaire,
      du php procédural sera nécessaire,
      un dossier pour déplacer les images grandeur nature,
      un autre pour les images crops !

      tout d'abord créer un fichier : lenomClass.php

      et colle ceci :

      le code pour redimensionner :

      <?php

      class Img {

      static public function creerMin($img,$chemin,$nom,$mlargeur=100,$mhauteur=100) {
      $nom = substr($nom,0,-4);
      $dimension = getimagesize($img);

      if(substr(strtolower($img),-4)==".jpg") {
      $image = imagecreatefromjpeg($img);
      }
      else if(substr(strtolower($img),-4)==".png") {
      $image = imagecreatefrompng($img);
      }
      else if(substr(strtolower($img),-4)==".gif") {
      $image = imagecreatefromgif($img);
      }
      else {
      return false;
      }

      $miniature = imagecreatetruecolor($mlargeur,$mhauteur);

      if($dimension[0]>($mlargeur/$mhauteur)*$dimension[1]) {
      $dimY = $mhauteur;
      $dimX = $mhauteur*$dimension[0]/$dimension[1];
      $decalX = -($dimX-$mlargeur)/2;
      $decalY = 0;
      }
      if($dimension[0]<($mlargeur/$mhauteur)*$dimension[1]) {
      $dimX = $mlargeur;
      $dimY = $mlargeur*$dimension[1]/$dimension[0];
      $decalY = -($dimY-$mhauteur)/2;
      $decalX=0;
      }
      if($dimension[0]==($mlargeur/$mhauteur)*$dimension[1]) {
      $dimX = $mlargeur;
      $dimY = $mhauteur;
      $decalX = 0;
      $decalY = 0;
      }

      imagecopyresampled($miniature, $image, $decalX, $decalY, 0, 0, $dimX, $dimY, $dimension[0], $dimension[1]);
      imagejpeg($miniature, $chemin . "/" . $nom . ".jpg", 90);
      return true;
      }
      }

      Ensuite créer un dossier : "galerie" par exemple et à l'intérieur de ce dossier créer un dossier miniature (par exemple tu peux les nommer autrement (se sont mes conventions à moi)).

      il faut une page php pour inclure ton formulaire et charger ta class php :

      page en php :

      <?php
      if (!empty($_FILES)) {
      require_once "Lefichierclass.php";
      if(isset($_FILES['img']) && !empty($_FILES['img'])) {
      $ds = DIRECTORY_SEPARATOR; //les slash antislash
      $cd = __DIR__ . $ds; //les directory ex : ../
      $img = $_FILES['img'];
      $extensions = strtolower(substr($img['name'] , -3));
      $allowedExtensions = ["jpg" , 'png' , 'gif' , 'jpeg']; // les extensions permisent !

      if (in_array($extensions , $allowedExtensions)) {
      move_uploaded_file($img['tmp_name'], $cd . ".." . $ds . "" . $ds . $img['name']); // /!\ ici on récupère que 'name' et non tmp_name
      if(!Img::creerMin($cd . ".." . $ds . "tondossierpourplacerlimageréel" . $ds . $img['name'], $cd . ".." . $ds . "tondossierpourplacerlimageréel" . $ds . "le dossier des miniatures", $img['name'] , 400, 224)) {
      // Sur la ligne du dessus on appel la classe creerMin et à la fin on redimensionne l'immage par les tailles vouluent !
      $erreur = "Erreur interne. Veuillez réessayer. Si le problème persiste veuillez contacter un administrateur.";
      }
      }
      else {
      $erreur = "Votre fichier n'est pas une image ! Les extensions permisent sont : png, jpg et gif ! Réessayer ou contactez un administrateur si l'erreur persiste !";
      }
      }
      }
      ?><!DOCTYPE html>
      <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
      <title></title>
      <link rel="stylesheet" href="css/style.css">
      <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
      <![endif]-->
      </head>
      <body>
      <?php
      if (isset($erreur)) {
      echo "$erreur";
      }
      ?> //indiquer une erreur si il y en a une
      <form method="post" action="pourmoicettememepage.php" enctype="multipart/form-data">
      <input type="file" name="img">
      <input type="submit" value="envoyer">
      </form>
      <?php
      $dossier = "../galerie/miniature";
      $dir = opendir($dossier);
      while ($file = readdir($dir)) {
      $allowedExtensions = array("jpg" , 'png' , 'gif' , 'jpeg');
      $extensions = strtolower(substr($file, -3 ));
      if (in_array($extensions , $allowedExtensions)) {

      ?>
      <img src="../le dossier image réel/le dossier image miniature/<?php echo $file; //les images ?>" />
      <?php

      }

      }

      ?> //afficher les images miniaturisées
      </body>
      </html>
      1. je sais que s'est un peu le fouillit donc si tu comprends pas trop trop va voir les vidéos de www.grafikart.fr et cherche galerie d'images en php ! ^^
    2. Si tu n'a ni GD ni imageMagick, le plus simple c'est de la faire en CSS, avec un overflow hidden pour cacher, et du JS pour le centrer.