2010-06-05 7 views
0

Cette fonction, que j'ai volée sans vergogne sur internet, recadre une zone de 90x60 à partir d'une image existante.PHP - Comment sécuriser un nom de variable unique?

Dans ce code, lorsque j'utilise la fonction pour plus d'un élément (image), l'un s'affiche au-dessus de l'autre (ils occupent le même espace de sortie).

Je pense que c'est parce que la fonction a le même nom (statique) ($ dest) pour la destination de l'image quand elle est créée (imagecopy).

J'ai essayé, comme vous pouvez le voir, d'inclure un second argument à la fonction cropit qui servirait de "nom" à la variable $ dest, mais cela n'a pas fonctionné.

Dans l'intérêt de la divulgation complète, j'ai 22 heures d'expérience PHP (par ailleurs le même nombre d'heures depuis le dernier je dormais) et je ne suis pas si malin pour commencer.

Même s'il y a quelque chose d'autre à l'œuvre ici, il me semble qu'il est généralement utile d'avoir un moyen de s'assurer qu'une variable reçoit toujours un nom unique.

<?php 

function cropit($srcimg, $dest) { 
$im = imagecreatefromjpeg($srcimg); 
$img_width = imagesx($im); 
$img_height = imagesy($im); 

$width = 90; 
$height = 60; 
$tlx = floor($img_width/2) - floor ($width/2); 
$tly = floor($img_height/2) - floor ($height/2); 

if ($tlx < 0) 
{ 
$tlx = 0; 
} 
if ($tly < 0) 
{ 
$tly = 0; 
} 
if (($img_width - $tlx) < $width) 
{ 
$width = $img_width - $tlx; 
} 
if (($img_height - $tly) < $height) 
{ 
$height = $img_height - $tly; 
} 
$dest = imagecreatetruecolor ($width, $height); 
imagecopy($dest, $im, 0, 0, $tlx, $tly, $width, $height); 
imagejpeg($dest); 
imagedestroy($dest); 
} 

$img = "imagefolder\imageone.jpg"; 
$img2 = "imagefolder\imagetwo.jpg"; 

cropit($img, $i1); 
cropit($img2, $i2); 
?> 
+2

Hahahahaha, la description hilarante :) mais ce qui est exactement votre question? De quel nom avez-vous besoin rendu unique? –

+1

Mmh il devrait fonctionner pour recadrer plus d'images puis un seul avec le code. Que voulez-vous dire exactement par * l'un affichera sur l'autre * Deux images différentes sont contenues dans un? Btw. votre deuxième paramètre ne fait rien, il ne sert à rien (vous ne définissez même pas une valeur pour '$ i '.) –

Répondre

0

J'espère vous avoir compris. Vous souhaitez enregistrer l'image recadrée dans un nom de fichier que vous avez dans les variables $i1 et $i2?

Ensuite, la dernière partie est probablement erronée. Il devrait ressembler à ceci:

<?php 
function cropit($srcimg, $filename) { 
$im = imagecreatefromjpeg($srcimg); 
$img_width = imagesx($im); 
$img_height = imagesy($im); 

$width = 90; 
$height = 60; 
$tlx = floor($img_width/2) - floor ($width/2); 
$tly = floor($img_height/2) - floor ($height/2); 

if ($tlx < 0) 
{ 
$tlx = 0; 
} 
if ($tly < 0) 
{ 
$tly = 0; 
} 
if (($img_width - $tlx) < $width) 
{ 
$width = $img_width - $tlx; 
} 
if (($img_height - $tly) < $height) 
{ 
$height = $img_height - $tly; 
} 
$dest = imagecreatetruecolor ($width, $height); 
imagecopy($dest, $im, 0, 0, $tlx, $tly, $width, $height); 
imagejpeg($dest, $filename); // Second parameter 
imagedestroy($dest); 
} 

imagejpeg a un second paramètre qui prend le nom de fichier devrait être enregistré en tant que.

+0

Merci imagejpeg avec le deuxième paramètre devrait prendre soin de lui.Wow, réponse awesome – user359294

1

Dans ce code, lorsque j'utilise la fonction pour plus d'un élément (image), l'un s'affiche sur l'autre (ils occupent le même espace de sortie).

Vous créez les données d'images brutes: vous ne pouvez servir plusieurs images à la fois dans une requête HTTP (vous pouvez enregistrer un nombre illimité de fichiers ofcourse, imagejpg peut prendre plusieurs paramètres), aucun navigateur décent saurait quoi fais-en.

Si vous voulez superposer une image sur une autre, regardez imagecopyresampled()

Je pense que c'est parce que la fonction a le même nom (statique) ($ dest) pour la destination de l'image lorsque c'est créé (imagecopy).

Ce n'est pas le cas, dès que votre fonction quitte $ dest n'existe plus (il n'existait dans le cadre de la fonction. Voir http://php.net/manual/en/language.variables.scope.php

+0

" [Y] ou ne peut pas servir les images à la fois dans une requête HTTP ", merci de m'avoir fait comprendre la nature du problème.C'était très utile.Merci, je vais enregistrer dans les fichiers, puis fusionner – user359294

+0

Aucun problème.Maintenant, si quelqu'un veut bien me dire pourquoi j'ai été rejeté, je peux modifier mes mauvaises manières et éviter de telles répercussions à l'avenir ... – Wrikken

Questions connexes