Создать картинку с GD, содержащую другие изображения - PullRequest
6 голосов
/ 29 мая 2010

Я хотел бы создать картинку на PHP с GD, составленной из других картинок. Например, у меня есть 6 (или больше) картинок, и я хотел бы создать ОДНУ картинку, которая содержит эти разные картинки.

Сложность заключается в том, что мое окончательное изображение должно иметь фиксированную ширину и высоту (304x179), поэтому, если различные изображения слишком велики, их необходимо вырезать. Это пример из IconFinder:

Это изображение имеет 6 изображений http://cdn.iconfinder.net/design/images/_thumbs/is_twitter.png

Эта картина состоит из 6 изображений, но 3-я птица (зеленая) вырезана, а 4, 5 и 6 вырезаны внизу. Это то, что я хочу, можете ли вы помочь мне написать этот код на PHP?

Спасибо

Ответы [ 2 ]

13 голосов
/ 29 мая 2010

Создайте свой основной образ и считайте его своим «холстом».

Оттуда используйте imagecopy () , чтобы скопировать меньшие изображения в изображение холста.

См. Это, например:

<?php
header('Content-Type: image/jpg');
$canvas = imagecreatetruecolor(304, 179);
$icon1 = imagecreatefromjpeg('icon.jpg');
$icon2 = imagecreatefromjpeg('icon2.jpg');
// ... add more source images as needed
imagecopy($canvas, $icon1, 275, 102, 0, 0, 100, 100);
imagecopy($canvas, $icon2, 0, 120, 0, 0, 100, 100);
// ... copy additional source images to the canvas as needed
imagejpeg($canvas);
?>

В моем примере icon.jpg - это изображение размером 100x100, которое я размещаю на холсте таким образом, чтобы его верхний левый угол находился на холсте 275, 102, что обрезает правую сторону.

Редактировать

Я изменил код, чтобы он был более похож на то, что вы делаете.

0 голосов
/ 29 мая 2010

Здесь нет ни одного проверенного модификатора spinet из одного из моих скриптов, надеюсь, он может быть полезен:

    header('Content-type: image/png');

    $image = array() //Populate this array with the image paths

    //Create the Letters Image Objects
      foreach($image as $a){
        $image['obj'][] = imageCreateFromPNG($a);
      }unset($a);

      $canvasW = 300;
      $canvasH = 300;

    //Create Canvas
      $photoImage = imagecreatetruecolor($canvasW,$canvasH);
      imagesavealpha($photoImage, true);
      $trans_color = imagecolorallocatealpha($photoImage, 0, 0, 0, 127);
      imagefill($photoImage, 0, 0, $trans_color);

    //Merge Images
      $Offset_y = 0;
      $images_by_row = 3;
      $images_rows_height = 100; // height of each image row
      $counter = 0;

      foreach($image['obj'] as $a){
        $counter++;

        $width = ceil(imagesx($a));
        $height = ceil(imagesy($a));

        if(!isset($offset)){ $offset = 1; }

        imageComposeAlpha($photoImage, $a, $offset, $Offset_y,$width,$height);

        if($offset >= 1){
          $offset = $offset + $width;
        }

        //Check if new row next time
        if($counter >= $images_by_row){
          if($images_by_row%$counter){
            $offset_y += $images_rows_height;
          }
        }

      }unset($a);

      imagepng($photoImage);
...