代码之家  ›  专栏  ›  技术社区  ›  Pablo

使用PHP脚本将多个图像合并为一个图像

  •  0
  • Pablo  · 技术社区  · 15 年前

    我有这个测试页 http://thechozenfew.net/projects/write_font.php 它将输入框中的文本生成为字体。每个字母都是不同的图片,如何用PHP脚本将所有这些图片连接成一个图片?

    这是我迄今为止尝试过的,但图像显示在彼此之上。

    Header ("Content-type: image/gif"); 
    
    $image1Url = "../images/avatar.png";
    $image2Url = "../images/key.png";
    $image3Url = "../images/safari.png";
    $image1 = imageCreateFromPNG($image1Url);
    $image2 = imageCreateFromPNG($image2Url);
    $image3 = imageCreateFromPNG($image3Url);
    
    $colorTransparent = imagecolorat($image1, 0, 0);
    imageColorTransparent ($image1, $colorTransparent);
    
    $colorTransparent = imagecolorat($image2, 0, 0);
    imageColorTransparent ($image2, $colorTransparent);
    
    $colorTransparent = imagecolorat($image3, 0, 0);
    imageColorTransparent ($image3, $colorTransparent);
    
    imageCopyMerge($image1, $image2, 0, 0, 0, 0, 96, 96, 100);
    
    imageCopyMerge($image1, $image3, 0, 0, 0, 0, 96, 96, 80);
    
    ImagePng ($image1);
    
    
    ImageDestroy ($image1);
    ImageDestroy ($image2);
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   jheddings    15 年前

    您的脚本正在相互顶部合并图像(有关 imagecopymerge )参数 $dst_x $dst_y 控制将源图像放置在合并画布上的位置。

    您需要指定与上一个图像的偏移量来合并它们:

    <?
        $offset2x = imagesx($image1);
        imageCopyMerge($image1, $image2, $offset2x, 0, 0, 0, 96, 96, 100);
    
        $offset3x = $offset2x + imagesx($image2);
        imageCopyMerge($image1, $image3, $offset3x, 0, 0, 0, 96, 96, 80);
    ?>
    

    请注意,您必须增加 $image1 将所有3个图像放在一起。

        2
  •  1
  •   Pablo    15 年前

    所以这就是我的结局

    <?php
    header('Content-type: image/png');
    
    function imageComposeAlpha( &$src, &$ovr, $ovr_x, $ovr_y, $ovr_w = false, $ovr_h = false, $opc = 127){
     imagecopy($src, $ovr, $ovr_x, $ovr_y, 0, 0, imagesx($ovr), imagesy($ovr) );
    }
    
    ////////////////////////---////////-----------------------------------
    
    $url = "../../images/socom_font/normal/Socom";
    
    //Covert the String iinto an Array
     $letter = str_split(strtoupper ($_GET['name']));
    //Populate Letters Image Path
     foreach($letter as $a){
       //exeptions
      if($a == "?"){ $a = "Question"; }
      if($a == "/"){ $a = "Slash"; }
      if($a == "%"){ $a = "Percent"; }
      if($a == " "){ $a = "Space"; }
      $image[] = $url.$a.".png";
     }unset($a); 
    //Create the Letters Image Objects
     foreach($image as $a){
      $image['obj'][] = imageCreateFromPNG($a);
     }unset($a);
    //calculate Canvas Width
     foreach($image['obj'] as $a){
      if(!isset($canvasW)){ $canvasW = 0; }
      $canvasW = imagesx($a) + $canvasW;
     }unset($a);
    //Create Canvas
     $photoImage = imagecreatetruecolor($canvasW,100);
     imagesavealpha($photoImage, true);
     $trans_color = imagecolorallocatealpha($photoImage, 0, 0, 0, 127);
     imagefill($photoImage, 0, 0, $trans_color);
    
    //Merge Images
     foreach($image['obj'] as $a){
      $width = ceil(imagesx($a));
      if(!isset($offset)){ $offset = 1; }
    
      imageComposeAlpha($photoImage, $a, $offset, 0,$width,100);
    
      if($offset >= 1){
       $offset = $offset + $width;
      }
     }unset($a);
    // Save it
     //Imagepng($photoImage, 'done.png'); 
    // Output to browser 
     Imagepng($photoImage); 
    
    //Destroy all Image Objects
     foreach($image['obj'] as $a){
      ImageDestroy($a);
     }
     ImageDestroy($photoImage);
    ?>
    

    现场链接 http://thechozenfew.net/projects/font/ImageMerge.php?name=it%20works