mirror of
https://github.com/sruupl/batflat.git
synced 2026-01-09 07:52:02 +01:00
450 lines
12 KiB
PHP
450 lines
12 KiB
PHP
<?php
|
|
/**
|
|
* Image
|
|
*
|
|
* Easy image handling using PHP 5 and the GDlib
|
|
*
|
|
* @copyright Copyright 2010-2011, ushi <ushi@porkbox.net>
|
|
* @link https://github.com/ushis/PHP-Image-Class
|
|
* @license DBAD License (http://philsturgeon.co.uk/code/dbad-license)
|
|
*/
|
|
|
|
namespace Inc\Core\Lib;
|
|
|
|
/**
|
|
* Image processor
|
|
*/
|
|
class Image
|
|
{
|
|
|
|
/**
|
|
* Image resource
|
|
*
|
|
* @var resource
|
|
* @access private
|
|
*/
|
|
private $image;
|
|
|
|
/**
|
|
* Type of image
|
|
*
|
|
* @var string
|
|
* @access private
|
|
*/
|
|
private $type = 'png';
|
|
|
|
/**
|
|
* Width of the image in pixel
|
|
*
|
|
* @var integer
|
|
* @access private
|
|
*/
|
|
private $width;
|
|
|
|
/**
|
|
* Height of the image in pixel
|
|
*
|
|
* @var integer
|
|
* @access private
|
|
*/
|
|
private $height;
|
|
|
|
/**
|
|
* Return infos about the image
|
|
*
|
|
* @return array image infos
|
|
* @access public
|
|
*/
|
|
public function getInfos($what = null)
|
|
{
|
|
if ($what !== null && in_array($what, ['width', 'height', 'type'])) {
|
|
return $this->{$what};
|
|
}
|
|
|
|
return array(
|
|
'width' => $this->width,
|
|
'height' => $this->height,
|
|
'type' => $this->type,
|
|
'resource' => $this->image,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get color in rgb
|
|
*
|
|
* @param string $hex Color in hexadecimal code
|
|
* @return array Color in rgb
|
|
* @access public
|
|
*/
|
|
private function hex2rgb($hex)
|
|
{
|
|
$hex = str_replace('#', '', $hex);
|
|
$hex = (preg_match('/^([a-fA-F0-9]{3})|([a-fA-F0-9]{6})$/', $hex)) ? $hex : '000';
|
|
|
|
switch (strlen($hex)) {
|
|
case 3:
|
|
$rgb['r'] = hexdec(substr($hex, 0, 1).substr($hex, 0, 1));
|
|
$rgb['g'] = hexdec(substr($hex, 1, 1).substr($hex, 1, 1));
|
|
$rgb['b'] = hexdec(substr($hex, 2, 1).substr($hex, 2, 1));
|
|
break;
|
|
|
|
case 6:
|
|
$rgb['r'] = hexdec(substr($hex, 0, 2));
|
|
$rgb['g'] = hexdec(substr($hex, 2, 2));
|
|
$rgb['b'] = hexdec(substr($hex, 4, 2));
|
|
break;
|
|
}
|
|
|
|
return $rgb;
|
|
}
|
|
|
|
/**
|
|
* Creates image resource from file
|
|
*
|
|
* @param string $path Path to an image
|
|
* @return boolean true if resource was created
|
|
* @access public
|
|
*/
|
|
public function load($path)
|
|
{
|
|
if (empty($path)) {
|
|
return false;
|
|
}
|
|
|
|
$file = @fopen($path, 'r');
|
|
|
|
if (!$file) {
|
|
return false;
|
|
}
|
|
|
|
fclose($file);
|
|
$info = getimagesize($path);
|
|
|
|
switch ($info[2]) {
|
|
case 1:
|
|
$this->image = imagecreatefromgif($path);
|
|
$this->type = 'gif';
|
|
break;
|
|
|
|
case 2:
|
|
$this->image = imagecreatefromjpeg($path);
|
|
$this->type = 'jpg';
|
|
break;
|
|
|
|
case 3:
|
|
$this->image = imagecreatefrompng($path);
|
|
$this->type = 'png';
|
|
imagealphablending($this->image, false);
|
|
imagesavealpha($this->image, true);
|
|
break;
|
|
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
$this->width = $info[0];
|
|
$this->height = $info[1];
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Creates image resource with background
|
|
*
|
|
* @param integer $width Width of the image
|
|
* @param integer $height Height of the image
|
|
* @param string $background Background color in hexadecimal code
|
|
* @return boolean true if resource was created
|
|
* @access public
|
|
*/
|
|
public function create($width, $height, $background = null)
|
|
{
|
|
if ($width > 0 && $height > 0) {
|
|
$this->image = imagecreatetruecolor($width, $height);
|
|
$this->width = $width;
|
|
$this->height = $height;
|
|
if (preg_match('/^([a-fA-F0-9]{3})|([a-fA-F0-9]{6})$/', $background)) {
|
|
$rgb = $this->hex2rgb($background);
|
|
$background = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']);
|
|
imagefill($this->image, 0, 0, $background);
|
|
} else {
|
|
imagealphablending($this->image, false);
|
|
$black = imagecolorallocate($this->image, 0, 0, 0);
|
|
imagefilledrectangle($this->image, 0, 0, $this->width, $this->height, $black);
|
|
imagecolortransparent($this->image, $black);
|
|
imagealphablending($this->image, true);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Resizes the image
|
|
*
|
|
* @param integer $width New width
|
|
* @param integer $height New height
|
|
* @return boolean true if image was resized
|
|
* @access public
|
|
*/
|
|
public function resize($width, $height = 0)
|
|
{
|
|
if ($width <= 0 && $height <= 0) {
|
|
return false;
|
|
} elseif ($width > 0 && $height <= 0) {
|
|
$height = $this->height*$width/$this->width;
|
|
} elseif ($width <= 0 && $height > 0) {
|
|
$width = $this->width*$height/$this->height;
|
|
}
|
|
|
|
$image = imagecreatetruecolor($width, $height);
|
|
imagealphablending($image, false);
|
|
imagesavealpha($image, true);
|
|
imagecopyresampled($image, $this->image, 0, 0, 0, 0, $width, $height, $this->width, $this->height);
|
|
$this->image = $image;
|
|
$this->width = $width;
|
|
$this->height = $height;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Crops a part of the image
|
|
*
|
|
* @param integer $x X-coordinate
|
|
* @param integer $y Y-coordinate
|
|
* @param integer $width Width of cutout
|
|
* @param integer $height Height of cutout
|
|
* @access public
|
|
*/
|
|
public function crop($x, $y, $width, $height)
|
|
{
|
|
$image = imagecreatetruecolor($width, $height);
|
|
imagealphablending($image, false);
|
|
imagesavealpha($image, true);
|
|
imagecopyresampled($image, $this->image, 0, 0, $x, $y, $width, $height, $width, $height);
|
|
$this->image = $image;
|
|
$this->width = $width;
|
|
$this->height = $height;
|
|
}
|
|
|
|
/**
|
|
* Resizes and crops image to specified size
|
|
*
|
|
* @param int $width New width
|
|
* @param int $height New height
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function fit($width, $height)
|
|
{
|
|
if ($this->width > $this->height) {
|
|
$this->resize(0, $height);
|
|
$this->crop(($this->width - $width) / 2, 0, $width, $height);
|
|
} else {
|
|
$this->resize($width);
|
|
$this->crop(0, ($this->height - $height) / 2, $width, $height);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Rotates image
|
|
*
|
|
* @param integer $angle in degree
|
|
* @access public
|
|
*/
|
|
public function rotate($angle)
|
|
{
|
|
$this->image = imagerotate($this->image, $angle, 0);
|
|
}
|
|
|
|
/**
|
|
* Creates rectangle
|
|
*
|
|
* @param integer $x1 X1-coordinate
|
|
* @param integer $y1 Y1-coordinate
|
|
* @param integer $x2 X2-coordinate
|
|
* @param integer $y2 Y2-coordinate
|
|
* @param string $color Color in hexadecimal code
|
|
* @access public
|
|
*/
|
|
public function rectangle($x1, $y1, $x2, $y2, $color)
|
|
{
|
|
$rgb = $this->hex2rgb($color);
|
|
$color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']);
|
|
imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $color);
|
|
}
|
|
/**
|
|
* Creates ellipse
|
|
*
|
|
* @param integer $x X-coordinate
|
|
* @param integer $y Y-coordinate
|
|
* @param integer $width Width of ellipse
|
|
* @param integer $height Height of ellipse
|
|
* @param string $color Color in hexadecimal code
|
|
* @access public
|
|
*/
|
|
public function ellipse($x, $y, $width, $height, $color)
|
|
{
|
|
$rgb = $this->hex2rgb($color);
|
|
$color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']);
|
|
imagefilledellipse($this->image, $x, $y, $width, $height, $color);
|
|
}
|
|
/**
|
|
* Creates polygon
|
|
*
|
|
* @param array $points Coordinates of the vertices
|
|
* @param string $color Color in hexadecimal code
|
|
* @access public
|
|
*/
|
|
public function polygon($points, $color)
|
|
{
|
|
$rgb = $this->hex2rgb($color);
|
|
$color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']);
|
|
$num = count($points)/2;
|
|
imagefilledpolygon($this->image, $points, $num, $color);
|
|
}
|
|
/**
|
|
* Draws a line
|
|
*
|
|
* @param array $points Coordinates of the vertices
|
|
* @param string $color Color in hexadecimal code
|
|
* @access public
|
|
*/
|
|
public function line($points, $color)
|
|
{
|
|
$rgb = $this->hex2rgb($color);
|
|
$color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']);
|
|
imageline($this->image, $points[0], $points[1], $points[2], $points[3], $color);
|
|
}
|
|
|
|
/**
|
|
* Writes on image
|
|
*
|
|
* @param integer $x X-coordinate
|
|
* @param integer $y Y-coordinate
|
|
* @param string $font Path to ttf
|
|
* @param integer $size Font size
|
|
* @param integer $angle in degree
|
|
* @param string $color Color in hexadecimal code
|
|
* @param string $text Text
|
|
* @access public
|
|
*/
|
|
public function write($x, $y, $font, $size, $angle, $color, $text)
|
|
{
|
|
$rgb = $this->hex2rgb($color);
|
|
$color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']);
|
|
imagettftext($this->image, $size, $angle, $x, $y, $color, $font, $text);
|
|
}
|
|
|
|
/**
|
|
* Merges image with another
|
|
*
|
|
* @param Image $img object
|
|
* @param mixed $x X-coordinate
|
|
* @param mixed $y Y-coordinate
|
|
* @access public
|
|
*/
|
|
public function merge($img, $x, $y)
|
|
{
|
|
$infos = $img->getInfos();
|
|
|
|
switch ($x) {
|
|
case 'left':
|
|
$x = 0;
|
|
break;
|
|
|
|
case 'right':
|
|
$x = $this->width-$infos['width'];
|
|
break;
|
|
|
|
default:
|
|
$x = $x;
|
|
}
|
|
|
|
switch ($y) {
|
|
case 'top':
|
|
$y = 0;
|
|
break;
|
|
|
|
case 'bottom':
|
|
$y = $this->height-$infos['height'];
|
|
break;
|
|
|
|
default:
|
|
$y = $y;
|
|
}
|
|
|
|
imagealphablending($this->image, true);
|
|
imagecopy($this->image, $infos['resource'], $x, $y, 0, 0, $infos['width'], $infos['height']);
|
|
}
|
|
|
|
/**
|
|
* Shows image
|
|
*
|
|
* @param string $type Filetype
|
|
* @access public
|
|
*/
|
|
public function show($type = 'png')
|
|
{
|
|
$type = ($type != 'gif' && $type != 'jpeg' && $type != 'png') ? $this->type : $type;
|
|
|
|
switch ($type) {
|
|
case 'gif':
|
|
header('Content-type: image/gif');
|
|
imagegif($this->image);
|
|
break;
|
|
|
|
case 'jpeg':
|
|
header('Content-type: image/jpeg');
|
|
imagejpeg($this->image, '', 100);
|
|
break;
|
|
|
|
default:
|
|
header('Content-type: image/png');
|
|
imagepng($this->image);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Saves image
|
|
*
|
|
* @param string $path Path to location
|
|
* @param string $type Filetype
|
|
* @return boolean true if image was saved
|
|
* @access public
|
|
*/
|
|
public function save($path, $quality = 90)
|
|
{
|
|
$dir = dirname($path);
|
|
$type = pathinfo($path, PATHINFO_EXTENSION);
|
|
|
|
if (!file_exists($dir) || !is_dir($dir)) {
|
|
return false;
|
|
}
|
|
|
|
if (!is_writable($dir)) {
|
|
return false;
|
|
}
|
|
|
|
if ($type != 'gif' && $type != 'jpeg' && $type != 'jpg' && $type != 'png') {
|
|
$type = $this->type;
|
|
$path .= '.'.$type;
|
|
}
|
|
|
|
switch ($type) {
|
|
case 'gif':
|
|
imagegif($this->image, $path);
|
|
break;
|
|
|
|
case 'jpeg': case 'jpg':
|
|
imagejpeg($this->image, $path, $quality);
|
|
break;
|
|
|
|
default:
|
|
imagepng($this->image, $path);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|