2010-08-30 8 views
1

OK, je pensais avoir compris cette fonction, mais j'ai un bloc mental complet sur celui-ci. Je voulais créer des vignettes rognées de taille 75x75 à partir de photos de 800x536.imagecopyresampled en PHP, quelqu'un peut-il l'expliquer?

La fonction de copie d'image recopiée a 10 paramètres possibles. J'ai d'abord essayé ceci:

// Starting point of crop 
     $tlx = floor(($width/2) - ($new_width/2)); //finds halfway point of big image and subtracts half of thumb. 
     $tly = floor(($height/2) - ($new_height/2)); //gets centre of image to be cropped. 

imagecopyresampled($tmp_img,$img,0,0,$tlx,$tly,$new_width,$new_height,$orig_width,$orig_height); 

ce trouve de chaque côté de la marque à mi-chemin sur la grande image et cultures dehors. ou alors je pensais. mais il actuall recadre un peu de l'image et laisse le côté droit et le fond en noir (vraisemblablement de l'imagecreatetruecolor plus tôt.)

ainsi j'ai trouvé un moyen de faire ce que je veux mais je veux que vous expliquiez comment cela fonctionne .

j'ai maintenant:

//Create thumbnails. 
      $new_width = 75; //pixels. 
      $new_height = 75; 

      if($width > $height) $biggest_side = $width; 
      else $biggest_side = $height; 

      //The crop size will be half that of the largest side 
      $crop_percent = .5; 
      $crop_width = $biggest_side*$crop_percent; 
      $crop_height = $biggest_side*$crop_percent; 

      $c1 = array("x"=>($width-$crop_width)/2, "y"=>($height-$crop_height)/2); 

     //Create new image with new dimensions to hold thumb 
     $tmp_img = imagecreatetruecolor($new_width,$new_height); 

     //Copy and resample original image into new image. 
      imagecopyresampled($tmp_img,$img,0,0,$c1['x'],$c1['y'],$new_width,$new_height,$crop_width,$crop_height); 

qu'il fait parfaitement, rétrécir l'image, puis affleurant au milieu, mais mes mathématiques ne sont pas très forte et aussi je pense qu'il est certainement que je ne comprendre pleinement la fonction de copie d'image recopiée

quelqu'un peut-il me promener à travers elle? paramètre par paramètre. surtout les deux derniers. à l'origine je suis entré dans la largeur et la hauteur de l'image originale, mais cela entre 400 et 400 (la moitié du côté le plus long). désolé pour la diatribe. espère que mon esprit comprend ce bientôt :)

Alex

Répondre

16

Il est assez simple, documenté here

Les paramètres:

1) dst_image de $, une poignée de GD valide représentant l'image que vous souhaitez copier eN
2) src_image de $, une poignée de GD valide represending l'image que vous copiez

dE

3) dst_x $ - offset X dans l'image de destination que vous souhaitez placer e e rééchantillonné image en
4) dst_y de $ - Y offset, ditto

5) src_x $ - X compensez dans l'image source que vous voulez commencer à copier à partir
6) src_y de $ - Y offset, ditto

7) $ dst_x - largeur X de l'image nouvellement rééchantillonné en $ dst_image
8) dst_y de $ - largeur Y, idem

9) src_x de $ - largeur X de la zone à copier de la src_image $
10) $ src_y - Y largeur, idem

Alors ...

Vous avez un src_image de $ qui est 800x536, et un dst_image de $ qui est 75x75

 $width = 800        $new_width = 75 
+-----------------------+      +----+ 
|      |      | | 
|      |      | | $new_height = 75 
|      | $height = 536   +----+ 
|      | 
|      | 
+-----------------------+ 

On dirait que vous voulez prendre le morceau milieu de l'image source et faire un vignette de cela, non?Ce morceau milieu devrait représenter la moitié de la hauteur & largeur de l'image originale, si vous voulez:

$start_X = floor($width/4); // 200 
$width_Y = floor($height/4); // 134 

    200  400  200  
+-----------------------+ 
|  |   |  | 134 
|-----+----------+------| 
|  | This part|  | 268 
|-----+----------+------| 
|  |   |  | 134 
+-----------------------+ 

$end_x = $start_X + (2 * $start_x) // 3 * $start_x = 600 
$end_y = $start_Y + (2 * $start_y) // 3 * $start_y = 402 

imagecopyresampled($src, $dst, 0, 0, $startX, $start_y, 75, 75, $end_x, $end_y); 
           a b c  d   e f g  h 

a, b - commencer à coller la nouvelle image dans le coin supérieur gauche de l'image de destination
c, d - commencer à sucer pixels de l'image originale à 200134
e, f - rendre le 75x75 d'image redimensionnées (remplir la vignette)
g, h - arrêter la copie pixels à 600x402 dans l'image originale

Or, ceci est en supposant que vous voulez que la vignette soit complètement remplie. Si vous voulez que l'image source soit rétrécie proportionnellement (donc elle a la même proportion de hauteur/largeur que l'original, vous devrez faire quelques calculs pour ajuster les paramètres a,b et e,f)

+0

wow merci beaucoup. Donc, vous utilisez les paramètres end_x et end_y pour les coordonnées d'arrêt, quand le manuel (je regarde ça beaucoup) dit que c'est la largeur et la hauteur Maintenant, ce que j'utilise maintenant, c'est que ça marche a 400x400 dans end_x et end_y, donc ça veut dire qu'il faut couper 400x400 du centre et que ça rétrécit en 75x75? –

+0

quand il dit "image source" pour le end_x/end_y, c'est la fin de la PIECE de l'image source que vous voulez travailler avec. Si vous voulez réduire l'image entière, c'est la hauteur/largeur de l'image originale. Sinon, c'est juste la hauteur/largeur du morceau que vous découpez. –

+0

droite donc im juste rétrécir un 400 par 400 morceau de l'image entière, puis en prenant le milieu 75x75 carrés de cela? Je pense que je comprends. huzzah! –