prendre une partie d'image

Eléphanteau du PHP | 10 Messages

20 sept. 2010, 16:10

Voici un code source qui marche bien pour redimensionné une image proportionnellement.J'espère faire des modifications pour juste prendre une morceau quelconque d'une image en 95*95. Merci

index.php
<html>
<head></head>
<body>
	<!--On affiche le formulaire d'envoi d'une image-->
	<center>
	<br /><hr />

	<form method="post" enctype="multipart/form-data" action="upload.php">
	<p>
	
	
	
	   Le nom de l'image redimensionner avec 95 ,95
	   <input type="text" name="video"><br><br>
	   
	  
	   
	<input type="file" name="fichier" size="30">
	<input type="submit" name="upload" value="Uploader">
	</p>
	</form>
	</center>
	
  </body>
  </html>
upload.php
<?php


$nomImage=$_POST['video'];

if( isset($_POST['upload']) ) // si formulaire soumis
{
    $content_dir = 

'upload/'; // dossier où sera déplacé le fichier

    $tmp_file = $_FILES['fichier']['tmp_name'];

    if( !

is_uploaded_file($tmp_file) )
    {
        exit("Le fichier est introuvable");
    }

    // on vérifie 

maintenant l'extension
    $type_file = $_FILES['fichier']['type'];

    if( !strstr($type_file, 'jpg') && !

strstr($type_file, 'jpeg') && !strstr($type_file, 'png') && !strstr($type_file, 'bmp') && !strstr

($type_file, 'gif') )
    {
        exit("Le fichier n'est pas une image");
    }

    // on copie le fichier 

dans le dossier de destination
	
	$ext = substr($_FILES['fichier']['name'], strrpos($_FILES

['fichier']['name'], '.'));

	$name_file = $nomImage.$ext;
	echo $name_file;


	//fonction pour 

changer les dimentions des fichiers
  function redimensionner($file, $maxwidth, $maxheight) {
/*
    $maxwidth 

= 171;
    $maxheight = 171;
  */
list($rawwidth, $rawheight, $type) = @getimagesize($file);

  if ($maxwidth < 

$rawwidth && $rawwidth >= $rawheight) {

    $width = $maxwidth;

    $height = ($width / $rawwidth) * 

$rawheight;

  }

  elseif ($maxheight < $rawheight && $rawheight >= $rawwidth) {

    $height = $maxheight;

    

$width = ($height /$rawheight) * $rawwidth;

  }

  else {

    $height = $rawheight;

    $width = $rawwidth;

  }

  

$imgbuffer = imagecreatetruecolor($width, $height);

  switch($type) {

    case 1: $image = 

imagecreatefromgif($file); break;

    case 2: $image = imagecreatefromjpeg($file); break;

    case 3: $image 

= imagecreatefrompng($file); break;

    case 4: $image = imagecreatefrombmp($file); break;

    default: exit

("Tried to create thumbnail from $file: not a valid image");

  }

  if (!$image) exit("Image creation from 

$file failed for an unknown reason. Probably not a valid image.");

  else {

    imagecopyresampled

($imgbuffer, $image, 0, 0, 0, 0, $width, $height, $rawwidth, $rawheight);

    imageinterlace($imgbuffer);

    

switch($type) {

	
	
	
      case 1: $image = imagegif($imgbuffer, $file, 80); break;

      case 2: 

$image = imagejpeg($imgbuffer, $file, 80); break;

      case 3: $image = imagepng($imgbuffer, $file, 7); 

break;

  

    }

  }

}


if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file) )

{

  exit("Nom de fichier non 

valide");

}

  else if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )

{

  exit("Impossible de 

copier le fichier dans $content_dir");

} 

redimensionner($content_dir.$name_file,95, 95);

}
?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 sept. 2010, 11:36

Modération :
Afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 3607 Messages

21 sept. 2010, 14:06

Et quelle est la question?

Eléphanteau du PHP | 10 Messages

26 oct. 2010, 10:27

Bonjour tout le monde,
J’ai reformulé ma question à nouveau
J'ai un scripte pour redimensionner les images proportionnellement, il prend la plus grande valeur (hauteur ou bien largeur) , et il redimensionne l'autre valeur proportionnellement.
Le seul problème sur ce script c'est qu’il ne permet pas de définir longueur max et hauteur max.

Par exemple, je voulais générer une image avec : width max : 171 et height max : 107
Si je prends une image avec les démentions width : 420, et height 298, le redimensionnement proportionnel cava donner :
420 >> 298
171 >> x
x= (298*171)/420= 121 (plus grand que je voulais comme hauteur en max 107).
Ce que j'image faire, mais je ne sais pas encore comment, c'est de lancer une boucle pour obtenir :
H >> W
171 >> 121 (supérieur de mon max, je ne prends pas) je fais H - 1
170 >> 120 (supérieur de mon max, je ne prends pas) je refais H-1
.....................................
.....................................
.....................................
150 >> 107 (<= 107, je le prends)
Ce qui est important pour moi c'est de respecter le redimensionnement proportionnel pou ne pas déformer l'image, et en même temps ne pas dépasser les démentions max.
Je suis à l'écoute de vos commentaires.
Merci d'avance
//****************************************index.php

<html>
<head></head>
<body>
<!--On affiche le formulaire d'envoi d'une image-->
<center>
<br /><hr />

<form method="post" enctype="multipart/form-data" action="upload.php">
<p>



Le nom de l'image redimensionner avec 95 ,95
<input type="text" name="video"><br><br>



<input type="file" name="fichier" size="30">
<input type="submit" name="upload" value="Uploader">
</p>
</form>
</center>

</body>
</html>


//****************************************upload.php

<?php


$nomImage=$_POST['video'];

if( isset($_POST['upload']) ) // si formulaire soumis
{
$content_dir = 'upload/'; // dossier où sera déplacé le fichier

$tmp_file = $_FILES

['fichier']['tmp_name'];

if( !is_uploaded_file($tmp_file) )
{
exit("Le fichier est introuvable");
}

// on vérifie maintenant l'extension
$type_file =

$_FILES['fichier']['type'];

if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'png') && !strstr($type_file, 'bmp') && !strstr($type_file,

'gif') )
{
exit("Le fichier n'est pas une image");
}

// on copie le fichier dans le dossier de destination

$ext = substr($_FILES['fichier']['name'],

strrpos($_FILES['fichier']['name'], '.'));

$name_file = $nomImage.$ext;
echo $name_file;


//fonction pour changer les dimentions des fichiers
function

redimensionner($file, $maxwidth, $maxheight) {

list($rawwidth, $rawheight, $type) = @getimagesize($file);

if ($maxwidth < $rawwidth && $rawwidth >= $rawheight) {

$width =

$maxwidth;

$height = ($width / $rawwidth) * $rawheight;

}

elseif ($maxheight < $rawheight && $rawheight >= $rawwidth) {

$height = $maxheight;

$width = ($height /

$rawheight) * $rawwidth;

}

else {

$height = $rawheight;

$width = $rawwidth;

}

$imgbuffer = imagecreatetruecolor($width, $height);

switch($type) {

case 1: $image =

imagecreatefromgif($file); break;

case 2: $image = imagecreatefromjpeg($file); break;

case 3: $image = imagecreatefrompng($file); break;

case 4: $image =

imagecreatefrombmp($file); break;

default: exit("Tried to create thumbnail from $file: not a valid image");

}

if (!$image) exit("Image creation from $file failed for an

unknown reason. Probably not a valid image.");

else {

imagecopyresampled($imgbuffer, $image, 0, 0, 0, 0, $width, $height, $rawwidth, $rawheight);

imageinterlace

($imgbuffer);

switch($type) {




case 1: $image = imagegif($imgbuffer, $file, 80); break;

case 2: $image = imagejpeg($imgbuffer, $file, 80);

break;

case 3: $image = imagepng($imgbuffer, $file, 7); break;



}

}

}


if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file) )

{

exit("Nom de fichier non valide");

}



else if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )

{

exit("Impossible de copier le fichier dans $content_dir");

}

redimensionner($content_dir.$name_file,171,

107);

}
?>


ViPHP
AB
ViPHP | 5818 Messages

26 oct. 2010, 15:05

Soit tu peux te servir de cette classe d'upload, soit t'en inspirer (car le fonctionnement que tu décris est inclus).

ViPHP
ViPHP | 3607 Messages

26 oct. 2010, 17:45

Pour une autre source d'inspiration...
Voici un bout de classe qui permet le redimensionnement proportionnel et l'extraction d'une partie de l'image (crop) :
class Hoathis_Images {
	
	public static function resize(
                $filename_orig,
                $filename_dest,
                $max_width,
                $max_height
        ){



            // Calcul des nouvelles dimensions
            list($width_orig, $height_orig) = getimagesize($filename_orig);

            if($width_orig > $max_width || $height_orig > $max_height){

                $fileinfos = pathinfo($filename_orig);

                $ext = strtolower($fileinfos['extension']);

                switch($ext){
                    case 'jpg':
                    case 'jpeg':
                        $old_img = imagecreatefromjpeg($filename_orig);
                    break;
                    case 'png':
                        $old_img = imagecreatefrompng($filename_orig);
                    break;
                    case 'gif':
                        $old_img = imagecreatefromgif($filename_orig);
                    break;
                }

                $ratio_orig = $width_orig/$height_orig;

                if ($max_width/$max_height > $ratio_orig) {
                   $new_width = $max_height*$ratio_orig;
                   $new_height = $max_height;
                } else {
                   $new_height = $max_width/$ratio_orig;
                   $new_width = $max_width;
                }


                // Redimensionnement
                $new_img = imagecreatetruecolor($new_width, $new_height);

                imagecopyresampled($new_img, $old_img, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);

                switch($ext){
                    case 'jpg':
                    case 'jpeg':
                        imagejpeg($new_img,$filename_dest,95);
                    break;
                    case 'png':
                        imagepng($new_img,$filename_dest,95);
                    break;
                    case 'gif':
                        imagegif($new_img,$filename_dest,95);
                    break;
                }
            }
            else {
                copy($filename_orig,$filename_dest);
            }
        }

        public static function crop(
                $filename_orig,
                $filename_dest,
                $x_orig,
                $y_orig,
                $width,
                $height
        ){



            $fileinfos = pathinfo($filename_orig);

            $ext = strtolower($fileinfos['extension']);

            switch($ext){
                case 'jpg':
                case 'jpeg':
                    $old_img = imagecreatefromjpeg($filename_orig);
                break;
                case 'png':
                    $old_img = imagecreatefrompng($filename_orig);
                break;
                case 'gif':
                    $old_img = imagecreatefromgif($filename_orig);
                break;
            }




            // Redimensionnement
            $new_img = imagecreatetruecolor($width, $height);

            imagecopyresampled($new_img, $old_img, 0, 0, $x_orig, $y_orig, $width, $height, $width, $height);

            switch($ext){
                case 'jpg':
                case 'jpeg':
                    imagejpeg($new_img,$filename_dest,100);
                break;
                case 'png':
                    imagepng($new_img,$filename_dest);
                break;
                case 'gif':
                    imagegif($new_img,$filename_dest);
                break;
            }
        }
}

Mammouth du PHP | 737 Messages

27 oct. 2010, 10:10

P ...consonne
H ...voyelle
O ...consonne
T ...voyelle
O ...consonne
S ... consonne
H ...voyelle
O ...consonne
P

9 lettres, pas mieux...
PHOTOSHOP :fete:

Megadeth
:axe:
Dyslexics are teople poo

Mammouth du PHP | 19672 Messages

27 oct. 2010, 10:26

Et une autre source d'inspiration sous la forme d'une piste à suivre pour ta solution : calcule la proportion entre largeur et hauteur à partir des dimensions maxi, et la même chose à partir des dimensions réelles de l'image : compare ensuite les deux en redimensionnant dans le sens approprié selon que le résultat est positif ou négatif... je te laisse mijoter ça tranquillement, c'est de la logique pure, si tu y réfléchis avec la plus grande attention, tu vas découvrir que c'est finalement tout à fait... mathématique :D
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 10 Messages

27 oct. 2010, 15:07

Bonjour Jojolapine,
Au fait, je cherche aussi à prendre une partie de l'image, par exemple le centre de chaque image.
J'ai pris ta fonction class Hoathis_Images, et j'ai essayé mélanger avec mon code, mais apparemment il existe des erreurs
Je suis à l'écoute de tes conseils



<!-----------------------------------------page index.php---------------------------------------->
<html>
<head></head>
<body>
	<!--On affiche le formulaire d'envoi d'une image-->
	<center>
	<br /><hr />

	<form method="post" enctype="multipart/form-data" action="upload.php">
	<p>
	
	
	
	   Le nom de l'image redimensionner avec 95 ,95
	   <input type="text" name="video"><br><br>
	   
	  
	   
	<input type="file" name="fichier" size="30">
	<input type="submit" name="upload" value="Uploader">
	</p>
	</form>
	</center>
	
  </body>
  </html>
<!----------------------------------------------------------------------------------------------->



<!-----------------------------------------page upload.php---------------------------------------->
<?php

$nomImage=$_POST['video'];

if( isset($_POST['upload']) ) // si formulaire soumis
{
    $content_dir = 'upload/'; // dossier où sera déplacé le fichier

    $tmp_file = $_FILES['fichier']['tmp_name'];

    if( !is_uploaded_file($tmp_file) )
    {
        exit("Le fichier est introuvable");
    }

    // on vérifie maintenant l'extension
    $type_file = $_FILES['fichier']['type'];

    if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'png') && !strstr($type_file, 'bmp') && 

!strstr($type_file, 'gif') )
    {
        exit("Le fichier n'est pas une image");
    }
	
	
	// on copie le fichier dans le dossier de destination
	$ext = substr($_FILES['fichier']['name'], strrpos($_FILES['fichier']['name'], '.'));
	$filename_orig = $nomImage.$ext;
	echo $filename_orig;
	
	
class Hoathis_Images {
       
        public static function resize(
                $filename_orig,
                $filename_dest,
                $max_width,
                $max_height
        ){



            // Calcul des nouvelles dimensions
            list($width_orig, $height_orig) = getimagesize($filename_orig);

            if($width_orig > $max_width || $height_orig > $max_height){

                $fileinfos = pathinfo($filename_orig);

                $ext = strtolower($fileinfos['extension']);

                switch($ext){
                    case 'jpg':
                    case 'jpeg':
                        $old_img = imagecreatefromjpeg($filename_orig);
                    break;
                    case 'png':
                        $old_img = imagecreatefrompng($filename_orig);
                    break;
                    case 'gif':
                        $old_img = imagecreatefromgif($filename_orig);
                    break;
                }

                $ratio_orig = $width_orig/$height_orig;

                if ($max_width/$max_height > $ratio_orig) {
                   $new_width = $max_height*$ratio_orig;
                   $new_height = $max_height;
                } else {
                   $new_height = $max_width/$ratio_orig;
                   $new_width = $max_width;
                }


                // Redimensionnement
                $new_img = imagecreatetruecolor($new_width, $new_height);

                imagecopyresampled($new_img, $old_img, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);

                switch($ext){
                    case 'jpg':
                    case 'jpeg':
                        imagejpeg($new_img,$filename_dest,95);
                    break;
                    case 'png':
                        imagepng($new_img,$filename_dest,95);
                    break;
                    case 'gif':
                        imagegif($new_img,$filename_dest,95);
                    break;
                }
            }
            else {
                copy($filename_orig,$filename_dest);
            }
        }

        public static function crop(
                $filename_orig,
                $filename_dest,
                $x_orig,
                $y_orig,
                $width,
                $height
        )
		{



            $fileinfos = pathinfo($filename_orig);

            $ext = strtolower($fileinfos['extension']);

            switch($ext){
                case 'jpg':
                case 'jpeg':
                    $old_img = imagecreatefromjpeg($filename_orig);
                break;
                case 'png':
                    $old_img = imagecreatefrompng($filename_orig);
                break;
                case 'gif':
                    $old_img = imagecreatefromgif($filename_orig);
                break;
            }




            // Redimensionnement
            $new_img = imagecreatetruecolor($width, $height);

            imagecopyresampled($new_img, $old_img, 0, 0, $x_orig, $y_orig, $width, $height, $width, $height);

            switch($ext){
                case 'jpg':
                case 'jpeg':
                    imagejpeg($new_img,$filename_dest,100);
                break;
                case 'png':
                    imagepng($new_img,$filename_dest);
                break;
                case 'gif':
                    imagegif($new_img,$filename_dest);
                break;
            }
        }
}

if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file) )

{

  exit("Nom de fichier non valide");

}

  else if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )

{

  exit("Impossible de copier le fichier dans $content_dir");

} 

Hoathis_Images($content_dir.$filename_dest,171, 107);

}

?>
<!----------------------------------------------------------------------------------------------->

Le principe que je voulais faire est proche de bout de code qui contient des erreurs aussi :
<?php 
// Crop dimensions. 
$width = 200; 
$height = 200; 
// Set the path to the image to resize 
$input_image = "monImage.png"; 
// Get the size of the original image into an array 
$size = getimagesize( $input_image ); 
// Prepare canvas 
$canvas = imagecreatetruecolor( $width, $height ); 
// Create a new image in the memory from the file  
$cropped = imagecreatefrompng( $input_image ); 
// Prepare image  crop - center the crop on the image 
$newwidth = $size[0] / 2; 
$newheight = $size[1] / 2; 
$cropLeft = ( $newwidth/2 ) - ( $width/2 ); 
$cropHeight = ( $newheight/2 ) - ( $height/2 ); 
// Generate the cropped image 
imagecopyresized( $canvas, $cropped, 0,0, $cropLeft, $cropHeight, $size[0], $size[1], $newwidth, $newheight ); 

header('Content-type: image/jpeg'); 
imagejpeg($canvas); 
// Clear the memory of the tempory images 

imagedestroy( $canvas ); 
imagedestroy( $cropped ); 
?>

ViPHP
ViPHP | 3607 Messages

27 oct. 2010, 15:16

Bonjour,
La classe s'utilise comme suit:
// redimensionnement de l'image  $filename_orig vers $filename_dest
Hoathis_Images::resize($filename_orig, $filename_dest, $max_width, $max_height);

// extraction d'un petit carré de 100x100px
// à partir du point de coordonnées ($x_orig, $y_orig)
Hoathis_Images::crop($filename_orig, $filename_dest, $x_orig, $y_orig, 100, 100);

ViPHP
AB
ViPHP | 5818 Messages

27 oct. 2010, 16:30

Pour une autre source d'inspiration...
Voici un bout de classe qui permet le redimensionnement proportionnel et l'extraction d'une partie de l'image (crop) :
class Hoathis_Images {
...
                switch($ext){
                    case 'jpg':
                    case 'jpeg':
                        imagejpeg($new_img,$filename_dest,95);
                    break;
                    case 'png':
                        imagepng($new_img,$filename_dest,95);
                    break;
                    case 'gif':
                        imagegif($new_img,$filename_dest,95);
                    break;
  
Y'a deux erreurs :
- imagepng le coefficient de qualité se situe entre 0 et 9
- imagegif il n'y a pas de coefficient de qualité

Sinon ça reste subjectif mais 95, c'est beaucoup pour le jpeg, ça fait de gros fichiers et perso je n'observe pas de gain de qualité passé les 85-90 :wink:

Eléphanteau du PHP | 10 Messages

27 oct. 2010, 17:07

J'ai essayé de groupé toute tes scripte mais ya toujours des problèmes, je me demande si ta un script complet?

ViPHP
ViPHP | 3607 Messages

27 oct. 2010, 17:09

Pour une autre source d'inspiration...
Voici un bout de classe qui permet le redimensionnement proportionnel et l'extraction d'une partie de l'image (crop) :
class Hoathis_Images {
...
                switch($ext){
                    case 'jpg':
                    case 'jpeg':
                        imagejpeg($new_img,$filename_dest,95);
                    break;
                    case 'png':
                        imagepng($new_img,$filename_dest,95);
                    break;
                    case 'gif':
                        imagegif($new_img,$filename_dest,95);
                    break;
  
Y'a deux erreurs :
- imagepng le coefficient de qualité se situe entre 0 et 9
- imagegif il n'y a pas de coefficient de qualité

Sinon ça reste subjectif mais 95, c'est beaucoup pour le jpeg, ça fait de gros fichiers et perso je n'observe pas de gain de qualité passé les 85-90 :wink:
Oups c'est des erreurs que j'ai corrigée de mon côté :)
Mais pas ici :p
Après pour le taux de compression, il me semblait voir les images un peu ternes... Du coup j'ai monté :)
En fait dans mon script je fait un resize, suivi d'un crop, du coup c'est peut-être le problème :/

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

27 oct. 2010, 19:55

y a du mélange avec ce message

bon courage ;)

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

ViPHP
AB
ViPHP | 5818 Messages

28 oct. 2010, 01:23

J'ai essayé de groupé toute tes scripte mais ya toujours des problèmes, je me demande si ta un script complet?
Si c'est pour un script complet, je t'ai donné un lien (c'est ici avec si besoin gestion des résultats et des erreurs).

Pour télécharger et redimensionner un ficher image à un maximum de 200*100 (en conservant les proportions) dans un répertoire nommé 'PHOTOS', le code de base est aussi simple que cela :
<?php require('class_upload.php');

$up = new Telechargement('PHOTOS','form1','phot');

$up->Set_Redim ('200','100');

$up->Upload('reload');
?>
<form enctype = "multipart/form-data" action = "#" method = "post">      
<input name = "phot" type = "file" size = "70" />                                 
<input type = "submit" name = "form1" value = "Envoyez"  />    
</form>
en considérant que la classe est enregistrée dans un fichier nommé "class_upload.php"

On peut difficilement faire plus simple, non ?
et on peut aussi compléter pour avoir une gestion des résultats et bien d'autres choses ...

Par contre cette classe ne fait pas de crop car je juge inapproprié de couper des fichiers à télécharger ne sachant pas par avance si la partie coupée n'est pas importante pour l'image (donc cette classe ne fait qu'un ou plusieurs redimensionnements proportionnels vers un ou plusieurs dossiers, ... et peut en même temps sauvegarder l'original dans un autre dossier etc.)