2010-11-29 5 views
2

J'ai un tableau d'objets (image, texte ou rectangle) et j'essaie de créer une image parmi eux. Mais il me semble que chaque fois que j'insère l'un des éléments, les éléments précédents sont effacés. voici mon code:créer une image avec plusieurs éléments en PHP

if(isset($_GET['elements'])){ 
    $elements = json_decode(stripslashes($_GET['elements'])); 
    $gfx = imagecreate(160,120); 
    $width = 160; 
    $height = 120; 
    $white = imagecolorallocate($gfx, 255, 255, 255); 
    $id = $_GET['id']; 
    $username=$_GET['username']; 
    $name=$_GET['name']; 
    foreach ($elements as $element){ 
     $type = $element->type; 
     switch($type){ 
      case 'textBox': 
       text_thumb($element,$gfx); 
       break; 
      case 'image': 
      image_thumb($element,$gfx,$name,$username); 
      break; 
      case 'rectangle': 
       box_thumb($element,$gfx); 
       break; 
     } 
    } 
    header('Content-type: image/png'); 
    imagepng($gfx,'../thumbnail/'.$username.'_'.$name.'_'.$id.'.png'); 

} 

function text_thumb ($element,$gfx){ 
    function wrap($fontSize, $angle, $fontFace, $string, $width){ 
     $ret = ""; 
     $arr = explode(' ', $string); 
     foreach ($arr as $word){ 
      $teststring = $ret.' '.$word; 
      $testbox = imagettfbbox($fontSize, $angle, $fontFace, $teststring); 
      if ($testbox[4]-$testbox[0] > $width){ 
       $ret.=($ret==""?"":"\n").$word; 
      } else { 
       $ret.=($ret==""?"":' ').$word; 
      } 
     } 
     return $ret; 
    } 
    $width = $element->width/5; 
    $left =$element->left/5; 
    $top =$element->top/5; 
    $string = $element->text; 
    $fontsize = 2.4; 
    $font = "../fonts/arial.TTF"; 
    $fonth = imagefontheight($fontsize); 
    $text = wrap($fontsize, 0, $font, $string, $width); 
    imagettftext($gfx,$fontsize,0,$left,$top,$black,$font,$text); 
} 

function box_thumb ($element,$gfx){ 
    $width = $element->width/5; 
    $height = $element->height/5; 
    $left =$element->left/5; 
    $top =$element->top/5; 
    $x2=$left+$width; 
    $y2=$top+$height; 
    $black = imagecolorallocate($gfx, 0, 0, 0); 
    imagefilledrectangle($gfx,$left, $top,$x2,$y2,$black); 
} 

function image_thumb ($element,$gfx,$name,$username){ 
    $height = $element->height; 
    $width = $element->width; 
    $left =$element->left/5; 
    $top =$element->top/5; 
    $src =$element->src; 
    $extype = explode(".", $src); 
    $type=$extype[1]; 
    if($type=="jpg"||$type=="JPG")$type="jpeg"; 
    $creat="imagecreatefrom".$type; 
    $insert=$creat("../user_pics/view/{$username}_{$name}_{$src}"); 
    imagecopyresampled($gfx, $insert, $left, $top, 0, 0, $width/5, $height/5, $width, $height); 
} 

Le code est utilisé comme webservice, voici un exemple de tableau éléments $:

Array 
(
    [0] => 
    [1] => 
    [2] => 
    [3] => 
    [4] => 
    [5] => 
    [6] => 
    [7] => stdClass Object 
     (
      [src] => 019.png 
      [id] => 7 
      [type] => image 
      [width] => 635 
      [height] => 205 
      [top] => 395 
      [left] => 84 
      [page] => 2 
     ) 

    [8] => stdClass Object 
     (
      [type] => rectangle 
      [top] => 33 
      [left] => 90 
      [page] => 2 
      [width] => 602 
      [height] => 128 
      [id] => 8 
     ) 

    [9] => stdClass Object 
     (
      [type] => textBox 
      [top] => 182 
      [left] => 171 
      [page] => 2 
      [width] => 539 
      [height] => 154 
      [id] => 9 
      [text] => SINA 
     ) 

) 

dois-je utiliser imagecopymerge ou est-il un moyen plus facile, Considérant que j'ai un nombre variable d'éléments dans l'image?

*** MISE À JOUR:

Je pensais que si je retire le « cas « image »: ... » une partie, à savoir que la créer de la boîte et du texte, il fonctionne très bien, et aussi si j'ai plusieurs images dans mon tableau, il comprend tous correctement, donc pourrait-il être à cause de "imagecopyresampled"?

+0

comment utilisez-vous une fonction une fonction ? –

+0

@Mihai Iorga vous pouvez définir des fonctions dans les fonctions en PHP, pas de problème avec ça. –

+0

ouais, c'est bien tant que vous gardez le champ d'application à l'esprit, quelqu'un a une idée de mon problème? : S –

Répondre

0

Bon je me suis dit, il travaillait comme dit Frode, mais le problème est qu'il n'a pas passé les couleurs aux fonctions pour une raison quelconque, il attirerait la boîte, mais en blanc, et parce que le fond était blanc aussi bien, vous pouvez voir la boîte, alors j'ai changé le code à ceci:

if(isset($_GET['elements'])){ 
    $elements = json_decode(stripslashes($_GET['elements'])); 
    $gfx = imagecreate(160,120); 
    $width = 160; 
    $height = 120; 
    $white = imagecolorallocate($gfx, 255, 255, 255); 
    $black = imagecolorallocate($gfx, 0, 0, 0); 
    $id = $_GET['id']; 
    $username=$_GET['username']; 
    $name=$_GET['name']; 
    foreach ($elements as $element){ 
     $type = $element->type; 
     switch($type){ 
      case 'textBox': 
       text_thumb($element,$gfx,$white); 
       break; 
      case 'image': 
       image_thumb($element,$gfx,$name,$username); 
       break; 
      case 'rectangle': 
       box_thumb($element,$gfx,$black); 
       break; 
     } 
    } 
    header('Content-type: image/png'); 
    imagepng($gfx,'../thumbnail/'.$username.'_'.$name.'_'.$id.'.png'); 
} 

et le reste à peu est la même ...

0

Je crois qu'il y a un problème de portée avec la variable $ gfx. Essayez de le renvoyer à partir de chaque fonction interne, puis passez-le à nouveau là où vous en avez besoin.

function text_thumb ($element,$gfx){ 
    // do stuff 
    return $gfx; 
} 
+0

Je l'ai changé, rien n'a changé ... Je pense que la portée est bonne –

Questions connexes