Создание изображения с использованием функций PHP, но с помощью встроенного кода - PullRequest
0 голосов
/ 23 октября 2018

ПРИМЕЧАНИЕ: кажется, некоторые думают, что я задаю вопрос «Должен ли я использовать этот стиль кода?», Но на самом деле я спрашиваю: «Как я могу достичь этого?».Извините, если мой вопрос сбивает с толку.

Для создания изображения с помощью PHP вы можете использовать такие базовые функции:

http://php.net/manual/en/ref.image.php

Но по умолчанию это выглядит довольно статично,Пример:

/* file: PHPImage.php */

$img = imagecreatefrompng('logo.png');

// Do some stuff to that image

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);

Я хотел бы создать класс, который может манипулировать изображениями на лету и передать ему функцию, которая может манипулировать $img при обратном вызове, и выполнять все эти встроенные операции ..что-то вроде этого:

<?php
    $img = new PHPImage("baseimage.png", function(&$thisimg){
        // Color functions here etc
    });
?>

<img src="<?php echo $img->URLResource; ?>" />

Я вижу, что это слабый пример, но мне просто интересно, возможен ли такой рабочий процесс.

Что мне интересно, так это: я понимаю, что вы могли быпередать параметры GET постоянной настройке страницы для этого, например.scripts/PHPImage.php?w=160&h=160&bgcol=255-0-0, а затем используйте переданные параметры для запуска реальных функций изображения на этой странице.Но можно ли в любом случае использовать фактические функции на изображении и генерировать их в случайном рабочем процессе, как, например, в моем примере с классом PHPImage выше?

Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 26 октября 2018

Для примера

<?php
echo "<pre>";

class PHPImage{
    protected $callback;
    protected $src = '';
    protected $image = null;
    protected $type = null;

    public function __construct($src, $callback=null){
        $this->src = $src;
        $this->type = exif_imagetype($this->src);
        $this->image = $this->open($this->src);

        $this->callback = $callback->bindTo($this); 
        //bingTo, changes scope to this class
        //that lets us access internal methods
        //for exmaple if we had a method PHPImage::hight($image);
        //we could access it using $this->height($image); from inside
        //the callback  function($image){ $height = $this->height($image); }
    }

    public function execute(){
        if(!$this->callback)return false;
        $this->image = $this->callback->__invoke($this->image); //call the magic method __invoke ($this->callback(), is not a method)
        return $this; //for  method chaining  $obj->foo()->bar();
    }

    public function open($src){
        //if called directly
        $type = $this->type ? $this->type : exif_imagetype($src);
        switch($type)
        {
            case IMAGETYPE_GIF:
                return imagecreatefromgif($src);
                break;
            case IMAGETYPE_JPEG:
                return imagecreatefromjpeg($src);
                break;
            case IMAGETYPE_PNG:
                $image = imagecreatefrompng($src);
                imagealphablending($image, true); // setting alpha blending on
                imagesavealpha($image, true); // save alphablending setting (important)
                return $image;
                break;
            case IMAGETYPE_WBMP:
                return imagecreatefromwbmp($src);
                break;
            default:
                throw new Exception('Unknown image type', 1);
        }
    }

    public function save($dest, $res=90){
        switch($this->type){
            case IMAGETYPE_GIF:
                imagegif($this->image, $dest, $res);
                break;
            case IMAGETYPE_JPEG:
                imagejpeg($this->image, $dest, $res);
                break;
            case IMAGETYPE_PNG:
                $res = ceil($res*0.1); //convert from 0-100 to 1-10
                imagepng($this->image, $dest, $res);
                break;
            case IMAGETYPE_WBMP:
                imagewbmp($this->image, $dest, $res);
                break;
            default:
                throw new Exception('Unknown image type',1);
        }
    }

}


(new PHPImage('C:\UniServerZ\www\artisticphoenix\public_html\wp\wp-content\uploads\2018\10\ajax.png', function($image){
    return imagerotate($image, 90, 0);
}))->execute()->save(__DIR__.'/new.png');

echo "Complete";

Я проверил это (и это работает, в основном, некоторые проблемы с прозрачными PNG), большая часть кода была взята (и изменена) из моего класса изображений, который я упомянул, который находится на GitHub

В основном любые GD функции, которые принимают ресурс изображения от функции из PHPImage::open(), будут работать, передавая аргумент $image внутри обратного вызова.

Я должен отметить, что $image является ресурсом, а не объектом, поэтому вы должны передать его с возвратом, вы можете сделать это как function(&$image), но я не проверял это.

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...