1 Câu hỏi: Làm cách nào để ghép hai hình ảnh trong PHP để tạo một sprite?

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Người dùng của tôi có thể tải lên hai hình ảnh và tôi phải tạo một sprite với cả hai hình ảnh cạnh nhau. Tôi đang vật lộn một chút để tìm cách làm thế nào tôi có thể hợp nhất chúng thành một hình ảnh trắng.

Tôi đã có ý tưởng sử dụng imagecopymerge() và đặt hình ảnh nguồn vào phần bên phải của hình ảnh đích. Tạo một PNG trắng và sử dụng lại imagecopymerge() với kết quả của imagecopymerge() đầu tiên của tôi và PNG trắng.

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 Câu trả lời                              1                         

Bạn có thể sử dụng lớp này: http://innvo.com/1315192249-css-sprites-with-php/"rel =" nofollow noreferrer " /a>

<?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();

Hoặc sử dụng luân phiên:

<?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);

Tôi hy vọng điều này sẽ giúp!

    
0
2019-05-08 17: 30: 46Z
  1. Có cách nào để làm điều đó mà không cần lớp không? nếu không, cảm ơn bạn đã giúp đỡ bạn :)
    2019-05-08 17: 06: 14Z
  2. @ AyoubShakur Chắc chắn, tôi vừa chỉnh sửa câu trả lời của mình để thêm giải pháp thay thế tôi vừa thử
    2019-05-08 17: 31: 40Z
nguồn đặt đây