1 Вопрос: Как объединить два изображения в PHP для создания спрайта?

вопрос создан в Wed, May 8, 2019 12:00 AM

Мой пользователь может загрузить два изображения, и мне нужно создать спрайт с обоими изображениями рядом. Я немного пытаюсь найти способ объединить их в белое изображение.

У меня была идея использовать imagecopymerge() и разместить исходное изображение в правой части конечного изображения. Создайте белый PNG и используйте снова imagecopymerge() с результатом моего первого imagecopymerge() и белого PNG.

function createimage() // Create the white PNG image where the two images concatenated will be stock
{
    public $img = imagecreate(1000, 1000);
    $white = imagecolorallocate($img, 255, 255, 255);
    imagecolortransparent($img, $white);
    imagepng($img, "sprite/image.png");
}


  // Trying to concatenate both images
  $first = imagecreatefrompng("fb.png");
  $second = imagecreatefrompng("izi.png");
  list($width, $height) = getimagesize("izi.png");
  list($widthsource, $heightsource) = getimagesize("fb.png");
  imagecopymerge($second, $first, $width, $height / 2, 0, 0, $widthsource, $heightsource, 100);
  imagepng($second, 'image.png');

  // Then merge my two images concatenate with the white PNG image
  createimage();
  list($widthvierge, $heightvierge) = getimagesize('sprite/image.png');
  imagecopymerge($img, $second, $widthvierge / 2, $heightvierge / 2, 0, 0, $widthvierge, $heightvierge, 100);
  imagepng($img, 'sprite/newsprite.png');
    
0
1 ответ                              1                         

Вы можете использовать этот класс: http://innvo.com/1315192249-css-sprites-with-php/ р>

<?php

class images_to_sprite {

    function images_to_sprite($folder,$output,$x,$y) {
        $this->folder = ($folder ? $folder : 'myfolder'); // Folder name to get images from, i.e. C:\myfolder or /home/user/Desktop/folder
        $this->filetypes = array('jpg'=>true,'png'=>true,'jpeg'=>true,'gif'=>true); // Acceptable file extensions to consider
        $this->output = ($output ? $output : 'mysprite'); // Output filenames, mysprite.png and mysprite.css
        $this->x = $x; // Width of images to consider
        $this->y = $y; // Heigh of images to consider
        $this->files = array();
    }

    function create_sprite() {

        $basedir = $this->folder;
        $files = array();

        // Read through the directory for suitable images
        if($handle = opendir($this->folder)) {
            while (false !== ($file = readdir($handle))) {
                $split = explode('.',$file);
                // Ignore non-matching file extensions
                if($file[0] == '.' || !isset($this->filetypes[$split[count($split)-1]]))
                    continue;
                // Get image size and ensure it has the correct dimensions
                $output = getimagesize($this->folder.'/'.$file);
                if($output[0] != $this->x && $output[1] != $this->y)
                    continue;
                // Image will be added to sprite, add to array
                $this->files[$file] = $file;
            }
            closedir($handle);
        }

        // yy is the height of the sprite to be created, basically X * number of images
        $this->yy = $this->y * count($this->files);
        $im = imagecreatetruecolor($this->x,$this->yy);

        // Add alpha channel to image (transparency)
        imagesavealpha($im, true);
        $alpha = imagecolorallocatealpha($im, 0, 0, 0, 127);
        imagefill($im,0,0,$alpha);

        // Append images to sprite and generate CSS lines
        $i = $ii = 0;
        $fp = fopen($this->output.'.css','w');
        fwrite($fp,'.'.$this->output.' { width: '.$this->x.'px; height: '.$this->y.'px; background-image: url('.$this->output.'.png); text-align:center; }'."\n");
            foreach($this->files as $key => $file) {
            fwrite($fp,'.'.$this->output.(++$ii).' { background-position: -0px -'.($this->y*$i).'px; }'."n");
            $im2 = imagecreatefrompng($this->folder.'/'.$file);
            imagecopy($im,$im2,0,($this->y*$i),0,0,$this->x,$this->y);
            $i++;
            }
        fclose($fp);
        imagepng($im,$this->output.'.png'); // Save image to file
        imagedestroy($im);
    }
}

$class = new images_to_sprite('imagefolder','sprite',63,63);
$class->create_sprite();

Или поочередно используйте это:

<?php

/* Two images */
$image1 = dirname(__FILE__).'/image1.png';
$image2 = dirname(__FILE__).'/image2.png';

/* Get images dimensions */
$size1 = getimagesize($image1);
$size2 = getimagesize($image2);

/* Load the two existing images */
$im1 = imagecreatefrompng($image1);
$im2 = imagecreatefrompng($image2);

/* Create the new image, width is combined but height is the max height of either image */
$im = imagecreatetruecolor($size1[0] + $size2[0], max($size1[1], $size2[1]));

/* Merge the two images into the new one */
imagecopy($im, $im1, 0, 0, 0, 0, $size1[0], $size1[1]);
imagecopy($im, $im2, $size1[0], 0, 0, 0, $size2[0], $size2[1]);

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

imagepng($im);
imagedestroy($im);

Надеюсь, это поможет!

    

0
2019-05-08 17: 30: 46Z
  1. Есть ли способ сделать это без класса? в противном случае спасибо за вашу помощь:)
    2019-05-08 17: 06: 14Z
  2. @ AyoubShakur Конечно, я только что отредактировал свой ответ, чтобы добавить альтернативное решение, которое я только что попробовал
    2019-05-08 17: 31: 40Z
источник размещен Вот