2017-08-10 3 views
2

J'essaie actuellement de travailler avec des images et PHP, grâce aux fonctions GD. Maintenant, je voudrais modifier la taille des images PNG. Voici un exemple d'un PNG Je voudrais redimensionner: enter image description hereRecadrer une image png avec PHP, supprimer la transparence vide

La ligne en pointillé représentent la frontière du PNG, l'arrière-plan est transparent, et je n'ai une étoile perdue au milieu d'un grand espace. J'aimerais recadrer cette étoile, pour obtenir un simple carré de l'étoile (même si le nouveau fond devient vide, ça n'a pas d'importance).

Comment pourrais-je faire quelque chose comme ça efficacement? Je pensais faire une boucle en vérifiant chaque pixel de l'image .. Essayant de trouver où l'image est, pour finalement recadrer avec une petite marge basée sur les valeurs minimales x/maximum X et minimum y/maximum y, mais si je commence à travailler avec des centaines de photos, ce serait vraiment long.

EDIT:

<?php 

$file = "./crop.png"; 

$ext = pathinfo($file, PATHINFO_EXTENSION); 

$image; 

switch ($ext){ 
case 'png': 
    $image = imagecreatefrompng($file); 
    break; 

case 'jpeg': 
case 'jpg': 
    $image = imagecreatefromjpeg($file); 
    break; 

case 'gif': 
    $image = imagecreatefromgif($file); 
    break; 
} 

$cropped = imagecropauto($image, IMG_CROP_DEFAULT); 

    if ($cropped !== false) { // in case a new image resource was returned 
     echo "=> Cropping needed\n"; 
     imagedestroy($image); // we destroy the original image 
     $image = $cropped;  // and assign the cropped image to $im 
    } 

    imagepng($image, "./cropped.png"); 
    imagedestroy($image); 
+0

Avez-vous essayé? Actuellement, c'est trop large. –

+0

Oui. Vérification de chaque pixel de l'image, recadrage de (min X, min Y) à (max X, max Y), en ajoutant un peu de marge. Cela fonctionne parfaitement pour une image, mais j'aimerais appliquer ce script à des centaines de photos. Je ne suis pas sûr qu'un serveur appréciera ce type de script en boucle, je suis assez nouveau avec PHP et s'il y a un moyen plus efficace de le faire, ça m'intéresse! – saperlipopette

+0

Si vous avez écrit le code et vous posez des questions sur l'efficacité, vous voulez probablement https://codereview.stackexchange.com –

Répondre

3

Si vous lisez et suivez les documentation, vous trouverez une fonction appelée imagecropauto qui fait exactement ce que vous voulez, il recadre le canal alpha de l'image.

rogner une image PNG avec canal alpha

$im = imagecreatefrompng("./star-with-alpha.png"); 
$cropped = imagecropauto($im, IMG_CROP_DEFAULT); 

if ($cropped !== false) { // in case a new image resource was returned 
    imagedestroy($im); // we destroy the original image 
    $im = $cropped;  // and assign the cropped image to $im 
} 

imagepng($im, "./star-with-alpha-crop.png"); 
imagedestroy($im); 

Vous pouvez essayer dirrectly à une page php en utilisant ce code:

<body> 

<img src="star-with-alpha.png"> 

<?php 

$im = imagecreatefrompng("./star-with-alpha.png"); 
$cropped = imagecropauto($im, IMG_CROP_DEFAULT); 

if ($cropped !== false) { // in case a new image resource was returned 
    imagedestroy($im); // we destroy the original image 
    $im = $cropped;  // and assign the cropped image to $im 
} 

imagepng($im, "./star-with-alpha-crop.png"); 
imagedestroy($im); 

?> 

<img src="star-with-alpha-crop.png"> 

</body> 

Le résultat

http://zikro.gr/dbg/php/crop-png/

Cropped image demo

+0

Merci pour votre réponse, il semble que ce soit la fonction que je cherchais! Mais mon fichier ne crée pas, j'ai mis mon code sur l'EDIT, j'utilise file_put_contents, ça ne marche pas, et même imagepng() ne fonctionne pas – saperlipopette

+0

L'erreur vient de mon switch mon mauvais, votre solution fonctionne parfaitement, merci beaucoup! – saperlipopette

+0

Bonjour, votre solution fonctionne très bien sur mon mac, mais je viens de déployer mon script sur un serveur (debian). C'est exactement la même version php (5.6.30) sur mon mac et sur le serveur. Lors de l'exécution du script sur mon ordinateur, il se rogne bien, mais quand je l'exécute sur le serveur, il ne recadre rien, et au lieu d'un fond blanc, il devient tout noir. Une idée de pourquoi le même code fonctionne sur mon mac mais pas sur un serveur distant? Merci d'avance – saperlipopette