Lorsque vous utilisez PHP pour traiter le recadrage d'images, la fonction ImageGetClip est souvent utilisée pour recadrer une zone spécifiée à partir de l'image d'origine. Cependant, certains développeurs constateront qu'en usage réel:. Cet article se concentrera sur ce problème commun, analysera les causes possibles en profondeur et fournira des solutions pratiques.
Supposons que nous ayons le code suivant:
$src = imagecreatefromjpeg('https://gitbox.net/images/sample.jpg');
$clip = imagecrop($src, ['x' => 50, 'y' => 50, 'width' => 200, 'height' => 100]);
if ($clip !== FALSE) {
imagejpeg($clip, 'https://gitbox.net/output/cropped.jpg');
imagedestroy($clip);
}
imagedestroy($src);
En théorie, nous voulons que l'image recadrée soit de 200x100 pixels. Mais parfois, la production peut être 199x100, et même une défaillance des cultures (retour fausse ).
Lorsque la zone que vous essayez de recadrer dépasse la limite de l'image d'origine, l'imagecrop reviendra fausse . Assurez-vous que la largeur x + <= la largeur d'image d'origine et la hauteur y + <= la hauteur d'image d'origine sont les conditions préalables pour éviter les défaillances des cultures.
Pendant le traitement de l'image, comme PHP traite en interne les points de pixels entiers, certains traitements de valeur de bord peuvent être décalés, en particulier dans les scénarios où les calculs de points flottants sont convertis en entiers.
Certains développeurs obtiennent des images source de l'adresse d'image zoomée dans la balise <MG> . Ce zoom est implémenté par le client, et le serveur traitera toujours la taille d'origine, ce qui entraîne une déviation de la zone des cultures.
Utilisez la fonction getImageSize () pour confirmer la largeur et la hauteur réelles de l'image pour vous assurer que la zone de recadrage ne dépasse pas les limites:
list($width, $height) = getimagesize('https://gitbox.net/images/sample.jpg');
Si les paramètres de recadrage proviennent des calculs (comme faire glisser la souris pour sélectionner la zone), il est recommandé d'utiliser Floor () ou Round () pour clarifier la logique de conversion pour éviter une erreur de 1 pixel en raison de différentes méthodes d'arrondi:
$x = floor($x);
$y = floor($y);
$w = floor($w);
$h = floor($h);
Si ImageCrop () fonctionne instable, vous pouvez implémenter manuellement la logique de culture:
$dst = imagecreatetruecolor($w, $h);
imagecopy($dst, $src, 0, 0, $x, $y, $w, $h);
imagejpeg($dst, 'https://gitbox.net/output/alternative.jpg');
imagedestroy($dst);
Cela peut éviter un comportement incontrôlable de l'imagecrop () et obtenir une compatibilité plus élevée.
Le recadrage d'images peut sembler simple, mais dans le développement réel, cela peut être plus de problèmes que prévu en raison des différences dans les sources d'image, le comportement du navigateur et les méthodes de traitement du serveur. Les stratégies de jugement et de solution introduites dans cet article espèrent vous aider à obtenir des images qui répondent plus facilement à la taille attendue lors de l'utilisation d'imageGipClip ou d'imagecrop .
La maîtrise de ces techniques peut non seulement réduire les bogues en ligne, mais également vous donner une compréhension plus approfondie du traitement d'image PHP.