120 votes

Redimensionner une image en PHP

Je veux écrire un code PHP qui redimensionne automatiquement toute image téléchargée via un formulaire à 147x147px, mais je n'ai aucune idée de la façon de procéder (je suis relativement novice en PHP).

Jusqu'à présent, j'ai réussi à télécharger des images, à reconnaître les types de fichiers et à nettoyer les noms, mais j'aimerais ajouter la fonctionnalité de redimensionnement dans le code. Par exemple, j'ai une image de test qui fait 2.3MB, et 1331x1331 en dimension, et j'aimerais que le code la redimensionne, ce qui, je suppose, compressera considérablement la taille du fichier de l'image, aussi.

Jusqu'à présent, j'ai obtenu ce qui suit :

if ($_FILES) {
                //Put file properties into variables
                $file_name = $_FILES['profile-image']['name'];
                $file_size = $_FILES['profile-image']['size'];
                $file_tmp_name = $_FILES['profile-image']['tmp_name'];

                //Determine filetype
                switch ($_FILES['profile-image']['type']) {
                    case 'image/jpeg': $ext = "jpg"; break;
                    case 'image/png': $ext = "png"; break;
                    default: $ext = ''; break;
                }

                if ($ext) {
                    //Check filesize
                    if ($file_size < 500000) {
                        //Process file - clean up filename and move to safe location
                        $n = "$file_name";
                        $n = ereg_replace("[^A-Za-z0-9.]", "", $n);
                        $n = strtolower($n);
                        $n = "avatars/$n";
                        move_uploaded_file($file_tmp_name, $n);
                    } else {
                        $bad_message = "Please ensure your chosen file is less than 5MB.";
                    }
                } else {
                    $bad_message = "Please ensure your image is of filetype .jpg or.png.";
                }
            }
$query = "INSERT INTO users (image) VALUES ('$n')";
mysql_query($query) or die("Insert failed. " . mysql_error() . "<br />" . $query);

1voto

Amir Forsati Points 1441

Je vous propose un moyen simple :

function resize($file, $width, $height) {
    switch(pathinfo($file)['extension']) {
        case "png": return imagepng(imagescale(imagecreatefrompng($file), $width, $height), $file);
        case "gif": return imagegif(imagescale(imagecreatefromgif($file), $width, $height), $file);
        default : return imagejpeg(imagescale(imagecreatefromjpeg($file), $width, $height), $file);
    }
}

1voto

Emiliano Barboza Points 176
private function getTempImage($url, $tempName){
  $tempPath = 'tempFilePath' . $tempName . '.png';
  $source_image = imagecreatefrompng($url); // check type depending on your necessities.
  $source_imagex = imagesx($source_image);
  $source_imagey = imagesy($source_image);
  $dest_imagex = 861; // My default value
  $dest_imagey = 96;  // My default value

  $dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);

  imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey);

  imagejpeg($dest_image, $tempPath, 100);

  return $tempPath;

}

Il s'agit d'une solution adaptée basée sur este Excellente explication. Ce type a fait une explication étape par étape. J'espère que tout le monde l'appréciera.

0voto

Sajid Sayyad Points 27

Vous pouvez essayer la bibliothèque PHP TinyPNG. En utilisant cette bibliothèque, votre image sera optimisée automatiquement pendant le processus de redimensionnement. Il vous suffit d'installer la bibliothèque et d'obtenir une clé API auprès de https://tinypng.com/developers . Pour installer une bibliothèque, exécutez la commande ci-dessous.

composer require tinify/tinify

Après cela, votre code est le suivant.

require_once("vendor/autoload.php");

\Tinify\setKey("YOUR_API_KEY");

$source = \Tinify\fromFile("large.jpg"); //image to be resize
$resized = $source->resize(array(
    "method" => "fit",
    "width" => 150,
    "height" => 100
));
$resized->toFile("thumbnail.jpg"); //resized image

J'ai écrit un blog sur le même sujet. http://artisansweb.net/resize-image-php-using-tinypng

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X