You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
4.7 KiB
203 lines
4.7 KiB
<?php |
|
|
|
declare(strict_types=1); |
|
|
|
namespace PhpMyAdmin\Image; |
|
|
|
use function count; |
|
use function extension_loaded; |
|
use function function_exists; |
|
use function imagearc; |
|
use function imagecolorallocate; |
|
use function imagecopyresampled; |
|
use function imagecreatefromstring; |
|
use function imagecreatetruecolor; |
|
use function imagedestroy; |
|
use function imagefilledpolygon; |
|
use function imagefilledrectangle; |
|
use function imagejpeg; |
|
use function imageline; |
|
use function imagepng; |
|
use function imagestring; |
|
use function imagesx; |
|
use function imagesy; |
|
|
|
use const PHP_VERSION_ID; |
|
|
|
final class ImageWrapper |
|
{ |
|
/** @var resource */ |
|
private $image; |
|
|
|
/** |
|
* @param resource $image |
|
*/ |
|
private function __construct($image) |
|
{ |
|
$this->image = $image; |
|
} |
|
|
|
/** |
|
* @return resource |
|
*/ |
|
public function getImage() |
|
{ |
|
return $this->image; |
|
} |
|
|
|
/** |
|
* @param array<string, int>|null $background |
|
* @psalm-param array{red: int, green: int, blue: int} $background |
|
*/ |
|
public static function create(int $width, int $height, ?array $background = null): ?self |
|
{ |
|
if (! extension_loaded('gd')) { |
|
return null; |
|
} |
|
|
|
$image = imagecreatetruecolor($width, $height); |
|
if ($image === false) { |
|
return null; |
|
} |
|
|
|
if (! isset($background, $background['red'], $background['green'], $background['blue'])) { |
|
return new self($image); |
|
} |
|
|
|
$backgroundColor = imagecolorallocate($image, $background['red'], $background['green'], $background['blue']); |
|
if ($backgroundColor === false) { |
|
imagedestroy($image); |
|
|
|
return null; |
|
} |
|
|
|
if (! imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $backgroundColor)) { |
|
imagedestroy($image); |
|
|
|
return null; |
|
} |
|
|
|
return new self($image); |
|
} |
|
|
|
public static function fromString(string $data): ?self |
|
{ |
|
if (! extension_loaded('gd')) { |
|
return null; |
|
} |
|
|
|
$image = imagecreatefromstring($data); |
|
if ($image === false) { |
|
return null; |
|
} |
|
|
|
return new self($image); |
|
} |
|
|
|
public function arc( |
|
int $centerX, |
|
int $centerY, |
|
int $width, |
|
int $height, |
|
int $startAngle, |
|
int $endAngle, |
|
int $color |
|
): bool { |
|
return imagearc($this->image, $centerX, $centerY, $width, $height, $startAngle, $endAngle, $color); |
|
} |
|
|
|
/** |
|
* @return int|false |
|
*/ |
|
public function colorAllocate(int $red, int $green, int $blue) |
|
{ |
|
return imagecolorallocate($this->image, $red, $green, $blue); |
|
} |
|
|
|
public function copyResampled( |
|
ImageWrapper $sourceImage, |
|
int $destinationX, |
|
int $destinationY, |
|
int $sourceX, |
|
int $sourceY, |
|
int $destinationWidth, |
|
int $destinationHeight, |
|
int $sourceWidth, |
|
int $sourceHeight |
|
): bool { |
|
return imagecopyresampled( |
|
$this->image, |
|
$sourceImage->getImage(), |
|
$destinationX, |
|
$destinationY, |
|
$sourceX, |
|
$sourceY, |
|
$destinationWidth, |
|
$destinationHeight, |
|
$sourceWidth, |
|
$sourceHeight |
|
); |
|
} |
|
|
|
public function destroy(): bool |
|
{ |
|
if (PHP_VERSION_ID >= 80000) { |
|
return true; |
|
} |
|
|
|
return imagedestroy($this->image); |
|
} |
|
|
|
public function filledPolygon(array $points, int $color): bool |
|
{ |
|
if (PHP_VERSION_ID < 80000) { |
|
return imagefilledpolygon($this->image, $points, (int) (count($points) / 2), $color); |
|
} |
|
|
|
return imagefilledpolygon($this->image, $points, $color); |
|
} |
|
|
|
public function height(): int |
|
{ |
|
return imagesy($this->image); |
|
} |
|
|
|
/** |
|
* @param resource|string|null $file |
|
*/ |
|
public function jpeg($file = null, int $quality = -1): bool |
|
{ |
|
if (! function_exists('imagejpeg')) { |
|
return false; |
|
} |
|
|
|
return imagejpeg($this->image, $file, $quality); |
|
} |
|
|
|
public function line(int $x1, int $y1, int $x2, int $y2, int $color): bool |
|
{ |
|
return imageline($this->image, $x1, $y1, $x2, $y2, $color); |
|
} |
|
|
|
/** |
|
* @param resource|string|null $file |
|
*/ |
|
public function png($file = null, int $quality = -1, int $filters = -1): bool |
|
{ |
|
if (! function_exists('imagepng')) { |
|
return false; |
|
} |
|
|
|
return imagepng($this->image, $file, $quality, $filters); |
|
} |
|
|
|
public function string(int $font, int $x, int $y, string $string, int $color): bool |
|
{ |
|
return imagestring($this->image, $font, $x, $y, $string, $color); |
|
} |
|
|
|
public function width(): int |
|
{ |
|
return imagesx($this->image); |
|
} |
|
}
|
|
|