Create image builder class to simplify creating placeholder images
This commit is contained in:
parent
8c6706f7de
commit
1c721af0ba
26
src/Ion/Exception/ImageCreationException.php
Normal file
26
src/Ion/Exception/ImageCreationException.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php declare(strict_types=1);
|
||||
/**
|
||||
* Hummingbird Anime List Client
|
||||
*
|
||||
* An API client for Kitsu to manage anime and manga watch lists
|
||||
*
|
||||
* PHP version 8
|
||||
*
|
||||
* @package HummingbirdAnimeClient
|
||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||
* @copyright 2015 - 2021 Timothy J. Warren
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @version 5.2
|
||||
* @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient
|
||||
*/
|
||||
|
||||
namespace Aviat\Ion\Exception;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* Exception for bad configuration
|
||||
*/
|
||||
class ImageCreationException extends RuntimeException {
|
||||
|
||||
}
|
167
src/Ion/ImageBuilder.php
Normal file
167
src/Ion/ImageBuilder.php
Normal file
@ -0,0 +1,167 @@
|
||||
<?php declare(strict_types=1);
|
||||
/**
|
||||
* Hummingbird Anime List Client
|
||||
*
|
||||
* An API client for Kitsu to manage anime and manga watch lists
|
||||
*
|
||||
* PHP version 8
|
||||
*
|
||||
* @package HummingbirdAnimeClient
|
||||
* @author Timothy J. Warren <tim@timshomepage.net>
|
||||
* @copyright 2015 - 2021 Timothy J. Warren
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @version 5.2
|
||||
* @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient
|
||||
*/
|
||||
|
||||
namespace Aviat\Ion;
|
||||
|
||||
use GdImage;
|
||||
|
||||
use Aviat\Ion\Exception\ImageCreationException;
|
||||
|
||||
/**
|
||||
* A wrapper around GD functions to create images
|
||||
*
|
||||
* @property GdImage|false|null $img
|
||||
*/
|
||||
class ImageBuilder {
|
||||
private GDImage|false|null $_img;
|
||||
|
||||
private int $fontSize = 10;
|
||||
|
||||
private function __construct(private int $width=200, private int $height=200 )
|
||||
{
|
||||
$this->_img = imagecreatetruecolor($this->width, $this->height);
|
||||
}
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
$this->cleanup();
|
||||
}
|
||||
|
||||
private function getImg(): GdImage
|
||||
{
|
||||
if ($this->_img instanceof GdImage)
|
||||
{
|
||||
return $this->_img;
|
||||
}
|
||||
|
||||
throw new ImageCreationException('Invalid GD object');
|
||||
}
|
||||
|
||||
public static function new(int $width=200, int $height=200): self
|
||||
{
|
||||
$i = new self($width, $height);
|
||||
if ($i->_img === FALSE)
|
||||
{
|
||||
throw new ImageCreationException('Could not create image object');
|
||||
}
|
||||
|
||||
return $i;
|
||||
}
|
||||
|
||||
public function setFontSize(int $size): self
|
||||
{
|
||||
$this->fontSize = $size;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function enableAlphaBlending(bool $enable): self
|
||||
{
|
||||
$ab = imagealphablending($this->getImg(), $enable);
|
||||
if ( ! $ab)
|
||||
{
|
||||
throw new ImageCreationException('Failed to toggle image alpha blending');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addCenteredText(string $text, int $red, int $green, int $blue, int $alpha=-1): self
|
||||
{
|
||||
// Create the font color
|
||||
$textColor = ($alpha > -1)
|
||||
? imagecolorallocatealpha($this->getImg(), $red, $green, $blue, $alpha)
|
||||
: imagecolorallocate($this->getImg(), $red, $green, $blue);
|
||||
if ($textColor === FALSE)
|
||||
{
|
||||
throw new ImageCreationException('Could not create image text color');
|
||||
}
|
||||
|
||||
// Generate placeholder text
|
||||
$fontWidth = imagefontwidth($this->fontSize);
|
||||
$fontHeight = imagefontheight($this->fontSize);
|
||||
$length = strlen($text);
|
||||
$textWidth = $length * $fontWidth;
|
||||
$fxPos = (int) ceil((imagesx($this->getImg()) - $textWidth) / 2);
|
||||
$fyPos = (int) ceil((imagesy($this->getImg()) - $fontHeight) / 2);
|
||||
|
||||
// Add the image text
|
||||
imagestring($this->getImg(), $this->fontSize, $fxPos, $fyPos, $text, $textColor);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addBackgroundColor(int $red, int $green, int $blue, int $alpha=-1): self
|
||||
{
|
||||
$fillColor = ($alpha > -1)
|
||||
? imagecolorallocatealpha($this->getImg(), $red, $green, $blue, $alpha)
|
||||
: imagecolorallocate($this->getImg(), $red, $green, $blue);
|
||||
|
||||
if ($fillColor === FALSE)
|
||||
{
|
||||
throw new ImageCreationException('Failed to create image fill color');
|
||||
}
|
||||
|
||||
$hasFilled = imagefill($this->getImg(), 0, 0, $fillColor);
|
||||
if ($hasFilled === FALSE)
|
||||
{
|
||||
throw new ImageCreationException('Failed to add background color to image');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function savePng(string $savePath, bool $saveAlpha = TRUE): bool
|
||||
{
|
||||
$setAlpha = imagesavealpha($this->getImg(), $saveAlpha);
|
||||
if ($setAlpha === FALSE)
|
||||
{
|
||||
throw new ImageCreationException('Failed to set image save alpha flag');
|
||||
}
|
||||
|
||||
return imagepng($this->getImg(), $savePath, 9);
|
||||
}
|
||||
|
||||
public function saveWebp(string $savePath): bool
|
||||
{
|
||||
return imagewebp($this->getImg(), $savePath);
|
||||
}
|
||||
|
||||
public function saveJpg(string $savePath): bool
|
||||
{
|
||||
return imagejpeg($this->getImg(), $savePath);
|
||||
}
|
||||
|
||||
public function saveGif(string $savePath): bool
|
||||
{
|
||||
return imagegif($this->getImg(), $savePath);
|
||||
}
|
||||
|
||||
public function cleanup(): void
|
||||
{
|
||||
$cleaned = FALSE;
|
||||
|
||||
if ($this->getImg() instanceof GdImage)
|
||||
{
|
||||
$cleaned = imagedestroy($this->getImg());
|
||||
}
|
||||
|
||||
if ($cleaned === FALSE)
|
||||
{
|
||||
throw new ImageCreationException('Failed to clean up image resource');
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user