prendre une partie d'image

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : prendre une partie d'image

Re: prendre une partie d'image

par jacque99 » 02 nov. 2010, 19:05

Je suis entrain de faire une petite modification, et je suis toujours bloqué.
J'essaye de faire une zone de text pour donner un nom à l’image thumb.
stocké la nom de thumbs dans $thumb_image_name puis enregistrer l'image avec.si ta une idée je suis à l'écoute

Re: prendre une partie d'image

par AB » 02 nov. 2010, 18:29

Voici un scripte qui marche à 100% et qui répond a ce que tu veux
Cdt
http://www.webmotionuk.co.uk/php-jquery ... -and-crop/
Effectivement j'ai testé et ça fonctionne bien. Mise à part la gestion des erreurs... mais bon c'est une très bonne base pour faire du crop en choisissant visuellement la zone.

Bibliothèque GD oblige, c'est comme je le disais plus haut un peu moins performant qu'un recadrage puis redimensionnement dans un logiciel photo, mais pour ceux qui n'exigent pas la meilleure qualité, c'est un bon outil qui donne des résultats très corrects.

Re: prendre une partie d'image

par jacque99 » 02 nov. 2010, 15:37

Si j'ai compris le fonctionnement cela demande que tu ouvres l'image, ensuite que l'on puisse définir un cadre de sélection et enfin que l'on télécharge l'image recadrée, soit l'équivalent de la fonction recadrage d'un logiciel photo + redimensionnement + téléchargement.

Voici un scripte qui marche à 100% et qui répond a ce que tu veux
Cdt
http://www.webmotionuk.co.uk/php-jquery ... -and-crop/

Re: prendre une partie d'image

par AB » 28 oct. 2010, 13:53

@AB: je suis en train de plancher sur ma partie admin pour justement faire le crop au bon endroit, avec du drag & drop etc...
Si tu veux je pourrais te filer les sources une fois finies ;)
Oui ce serait intéressant que tu poste le code dans les contributions.

Si j'ai compris le fonctionnement cela demande que tu ouvres l'image, ensuite que l'on puisse définir un cadre de sélection et enfin que l'on télécharge l'image recadrée, soit l'équivalent de la fonction recadrage d'un logiciel photo + redimensionnement + téléchargement.

Sur le principe c'est assez sympa mais à partir du moment où il y a du travail à faire sur l'image j'ai tendance à conseiller l'utilisation d'un logiciel photo car le résultat est bien meilleur. Par exemple dans mes parties admin il y a la possibilité d'utiliser le redimensionnement php mais les admins ne l'utilisent pas et préfèrent télécharger directement les photos redimensionnées car ils y gagnent en temps et en qualité. En temps dès qu'il y a plus d'une ou deux photos à télécharger et en qualité toujours car le redimensionnement php donne une qualité inférieure (bien qu'acceptable) à celui d'un logiciel photo (peut-être cela vient de l'accentuation des contours qui n'est pas pris en charge par php...) Pour une meilleure qualité et plus de possibilités peut-être faudrait-il aller voir du côté de ImageMagick...

Cela dit ton code sera toujours intéressant à voir :)

Re: prendre une partie d'image

par jacque99 » 28 oct. 2010, 09:40

Merci à vous tous AB , jojolapine et merci pour vos réponses.
Merci aussi à moogli qu'elle ma filé plusieurs sources
Au fait pour mon script, j’ai fait un calcule de la proportion entre largeur et hauteur à partir des dimensions maxi, et la même chose à partir des dimensions réelles de l'image : j'ai comparé ensuite les deux en redimensionnant dans le sens approprié selon que le résultat est positif ou négatif.
Finalement, mon code marche :),
Cava me fait plaisir jojolapine de me filler quelque chose pour le crop, et si je trouverai quelque chose, je la posterai au forum
Voici le code de redimensionnement proportionnel.
<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>

<?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;  }   
				
				if ($maxheight < $rawheight && $rawheight >= $rawwidth) {   
				$height = $maxheight;   
				$width = ($height /  $rawheight) * $rawwidth;  }  
 	
 
				if($height > $maxheight) {  
				$width = ($maxheight / $height) * $width;  
				$height = $maxheight; } 
				
				
				
				
  $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);

}
?>

Re: prendre une partie d'image

par jojolapine » 28 oct. 2010, 08:41

@AB: je suis en train de plancher sur ma partie admin pour justement faire le crop au bon endroit, avec du drag & drop etc...
Si tu veux je pourrais te filer les sources une fois finies ;)

Re: prendre une partie d'image

par AB » 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.)

Re: prendre une partie d'image

par moogli » 27 oct. 2010, 19:55

y a du mélange avec ce message

bon courage ;)

@+

Re: prendre une partie d'image

par jojolapine » 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 :/

Re: prendre une partie d'image

par jacque99 » 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?

Re: prendre une partie d'image

par AB » 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:

Re: prendre une partie d'image

par jojolapine » 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);

Re: prendre une partie d'image

par jacque99 » 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 ); 
?>

Re: prendre une partie d'image

par Cyrano » 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

Re: prendre une partie d'image

par Megadeth » 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: