doumuyu0837
doumuyu0837
2011-02-11 17:56

如何在PHP中将多个图像拼接成一个单独的图像?

已采纳

I am bulding a facebook app,I need to switch multiple profile pictures into one large image. Is there any way possible in php?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • duanchongchu5177 duanchongchu5177 10年前

    See the example on http://www.php.net/manual/en/function.imagecopy.php and use imagecopy() multiple times.

    点赞 评论 复制链接分享
  • dsg7513 dsg7513 5年前

    I am new to this question, but I am developing a script to take images and stitch them together. Right now it only works if all the images are the same size, but I am working to change that and I welcome contributions. I've used this to make CSS image-hover/non-hover state graphics for web site:

        /**
         * Image stitching function.
         *
         * Now operates with images of varying heights as well as widths.
         *
         * @param array $files
         * An array of files. Each element is a path to the file in question.
         *
         * @param int $rows
         * The number of rows the end resulting image will have. The images
         * will be added to the new image in the order of the array divided
         * equally in number to the rows specified here.
         * 
         * @param int $action
         * An integer (or static define) of the action to take on the resulting
         * image.
         *  IMAGE_STITCH_DISPLAY - Display the item (default action).
         *  IMAGE_STITCH_SAVE - Save the image to the file system (path required).
         *  IMAGE_STITCH_RETURN - Return the resulting file pointer to the calling
         *                       function for processing there.
         *
         * @param string $path
         * The path of where to save the resulting new image.
         *
         * @return image $image
         * The image data that can have whatever done to it.
         */
        function image_stitch($files, $rows = 2, $action = IMAGE_STITCH_DISPLAY, $path = NULL) {
          foreach($files as $file) {
            $path = explode('.', $file);
            if ($path[count($path)-1] == 'png') {
              $images[] = imagecreatefrompng($file);
            } 
            else {
              $images[] = imagecreatefromjpeg($file);
            }
          }
          $number_of_images = count($images);
          $number_of_columns = ($number_of_images / $rows) - 1;
          $total_width = 0;
          $max_width = 0;
          $total_heights = array();
          $widths = array(array());
          $grid = array(array());
          for ($y = 1; $y <= $rows; $y++) {
            $this_height = $this_width = 0; 
            for ($x = 0; $x <= $number_of_columns; $x++) {
              if (empty($files[(( $y + ($x - 1)) + ($number_of_columns * ($y - 1)))])) {
                next;
              }
              $image_size = getimagesize($files[(( $y + ($x - 1)) + ($number_of_columns * ($y - 1)))]);
              $grid[$x][$y] = $images[(( $y + ($x - 1)) + ($number_of_columns * ($y - 1)))];
              $width = $image_size[0];
              $height = $image_size[1];
              $widths[$x][$y][] = $width;
    
              $this_width += $width;
              if ($height > $this_height) {
                $this_height = $height;
              }
    
              if ($x == 0 && $y > 1) {
                $total_heights[] = $this_height;
                if ($max_width < $this_width) {
                  $max_width = $this_width;
                }
              }
            }
          }
    
          $total_heights[] = $this_height;
          if ($max_width < $this_width) {
            $max_width = $this_width;
          }
    
          $destination_image = imagecreatetruecolor($max_width, array_sum($total_heights));
          $black = imagecolorallocate($destination_image, 0, 0, 0);
          imagecolortransparent($destination_image, $black);
          imagealphablending($destination_image, FALSE);
          imagesavealpha($destination_image, TRUE);
    
          // place our images
          foreach($grid as $instance_key => $instance) {
            $height = $total_heights[$instance_key];
            foreach($instance as $reference_key => $reference) {
              imagecopyresampled($destination_image, $reference, $instance_key * 180, ($reference_key - 1) * 180, 0, 0, 180, 180, 180, 180);
            }
          }
    
          // Display the image if directed
          if ($action = IMAGE_STITCH_DISPLAY) {
            header('content-type: image/png');
            imagepng($destination_image);
            imagedestroy($destination_image);
            exit();
          }
    
          // Return the image if directed.
          if ($action == IMAGE_STITCH_RETURN) {
            return $destination_image;
          }
    
          // If we are saving the image, save it with no compression or filters.
          if (!$empty($path)) {
            imagepng($destination_image, $path, 0, PNG_NO_FILTER);
          }
    
          return TRUE;
        }
    
    点赞 评论 复制链接分享

相关推荐