diff options
Diffstat (limited to 'public/system/library/image.php')
-rw-r--r-- | public/system/library/image.php | 339 |
1 files changed, 339 insertions, 0 deletions
diff --git a/public/system/library/image.php b/public/system/library/image.php new file mode 100644 index 0000000..b1d7e9f --- /dev/null +++ b/public/system/library/image.php @@ -0,0 +1,339 @@ +<?php +/** + * @package OpenCart + * @author Daniel Kerr + * @copyright Copyright (c) 2005 - 2017, OpenCart, Ltd. (https://www.opencart.com/) + * @license https://opensource.org/licenses/GPL-3.0 + * @link https://www.opencart.com +*/ + +/** +* Image class +*/ +class Image { + private $file; + private $image; + private $width; + private $height; + private $bits; + private $mime; + + /** + * Constructor + * + * @param string $file + * + */ + public function __construct($file) { + if (!extension_loaded('gd')) { + exit('Error: PHP GD is not installed!'); + } + + if (file_exists($file)) { + $this->file = $file; + + $info = getimagesize($file); + + $this->width = $info[0]; + $this->height = $info[1]; + $this->bits = isset($info['bits']) ? $info['bits'] : ''; + $this->mime = isset($info['mime']) ? $info['mime'] : ''; + + if ($this->mime == 'image/gif') { + $this->image = imagecreatefromgif($file); + } elseif ($this->mime == 'image/png') { + $this->image = imagecreatefrompng($file); + } elseif ($this->mime == 'image/jpeg') { + $this->image = imagecreatefromjpeg($file); + } + } else { + exit('Error: Could not load image ' . $file . '!'); + } + } + + /** + * + * + * @return string + */ + public function getFile() { + return $this->file; + } + + /** + * + * + * @return array + */ + public function getImage() { + return $this->image; + } + + /** + * + * + * @return string + */ + public function getWidth() { + return $this->width; + } + + /** + * + * + * @return string + */ + public function getHeight() { + return $this->height; + } + + /** + * + * + * @return string + */ + public function getBits() { + return $this->bits; + } + + /** + * + * + * @return string + */ + public function getMime() { + return $this->mime; + } + + /** + * + * + * @param string $file + * @param int $quality + */ + public function save($file, $quality = 90) { + $info = pathinfo($file); + + $extension = strtolower($info['extension']); + + if (is_resource($this->image)) { + if ($extension == 'jpeg' || $extension == 'jpg') { + imagejpeg($this->image, $file, $quality); + } elseif ($extension == 'png') { + imagepng($this->image, $file); + } elseif ($extension == 'gif') { + imagegif($this->image, $file); + } + + imagedestroy($this->image); + } + } + + /** + * + * + * @param int $width + * @param int $height + * @param string $default + */ + public function resize($width = 0, $height = 0, $default = '') { + if (!$this->width || !$this->height) { + return; + } + + $xpos = 0; + $ypos = 0; + $scale = 1; + + $scale_w = $width / $this->width; + $scale_h = $height / $this->height; + + if ($default == 'w') { + $scale = $scale_w; + } elseif ($default == 'h') { + $scale = $scale_h; + } else { + $scale = min($scale_w, $scale_h); + } + + if ($scale == 1 && $scale_h == $scale_w && $this->mime != 'image/png') { + return; + } + + $new_width = (int)($this->width * $scale); + $new_height = (int)($this->height * $scale); + $xpos = (int)(($width - $new_width) / 2); + $ypos = (int)(($height - $new_height) / 2); + + $image_old = $this->image; + $this->image = imagecreatetruecolor($width, $height); + + if ($this->mime == 'image/png') { + imagealphablending($this->image, false); + imagesavealpha($this->image, true); + $background = imagecolorallocatealpha($this->image, 255, 255, 255, 127); + imagecolortransparent($this->image, $background); + } else { + $background = imagecolorallocate($this->image, 255, 255, 255); + } + + imagefilledrectangle($this->image, 0, 0, $width, $height, $background); + + imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->width, $this->height); + imagedestroy($image_old); + + $this->width = $width; + $this->height = $height; + } + + /** + * + * + * @param string $watermark + * @param string $position + */ + public function watermark($watermark, $position = 'bottomright') { + switch($position) { + case 'topleft': + $watermark_pos_x = 0; + $watermark_pos_y = 0; + break; + case 'topcenter': + $watermark_pos_x = intval(($this->width - $watermark->getWidth()) / 2); + $watermark_pos_y = 0; + break; + case 'topright': + $watermark_pos_x = $this->width - $watermark->getWidth(); + $watermark_pos_y = 0; + break; + case 'middleleft': + $watermark_pos_x = 0; + $watermark_pos_y = intval(($this->height - $watermark->getHeight()) / 2); + break; + case 'middlecenter': + $watermark_pos_x = intval(($this->width - $watermark->getWidth()) / 2); + $watermark_pos_y = intval(($this->height - $watermark->getHeight()) / 2); + break; + case 'middleright': + $watermark_pos_x = $this->width - $watermark->getWidth(); + $watermark_pos_y = intval(($this->height - $watermark->getHeight()) / 2); + break; + case 'bottomleft': + $watermark_pos_x = 0; + $watermark_pos_y = $this->height - $watermark->getHeight(); + break; + case 'bottomcenter': + $watermark_pos_x = intval(($this->width - $watermark->getWidth()) / 2); + $watermark_pos_y = $this->height - $watermark->getHeight(); + break; + case 'bottomright': + $watermark_pos_x = $this->width - $watermark->getWidth(); + $watermark_pos_y = $this->height - $watermark->getHeight(); + break; + } + + imagealphablending( $this->image, true ); + imagesavealpha( $this->image, true ); + imagecopy($this->image, $watermark->getImage(), $watermark_pos_x, $watermark_pos_y, 0, 0, $watermark->getWidth(), $watermark->getHeight()); + + imagedestroy($watermark->getImage()); + } + + /** + * + * + * @param int $top_x + * @param int $top_y + * @param int $bottom_x + * @param int $bottom_y + */ + public function crop($top_x, $top_y, $bottom_x, $bottom_y) { + $image_old = $this->image; + $this->image = imagecreatetruecolor($bottom_x - $top_x, $bottom_y - $top_y); + + imagecopy($this->image, $image_old, 0, 0, $top_x, $top_y, $this->width, $this->height); + imagedestroy($image_old); + + $this->width = $bottom_x - $top_x; + $this->height = $bottom_y - $top_y; + } + + /** + * + * + * @param int $degree + * @param string $color + */ + public function rotate($degree, $color = 'FFFFFF') { + $rgb = $this->html2rgb($color); + + $this->image = imagerotate($this->image, $degree, imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2])); + + $this->width = imagesx($this->image); + $this->height = imagesy($this->image); + } + + /** + * + * + */ + private function filter() { + $args = func_get_args(); + + call_user_func_array('imagefilter', $args); + } + + /** + * + * + * @param string $text + * @param int $x + * @param int $y + * @param int $size + * @param string $color + */ + private function text($text, $x = 0, $y = 0, $size = 5, $color = '000000') { + $rgb = $this->html2rgb($color); + + imagestring($this->image, $size, $x, $y, $text, imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2])); + } + + /** + * + * + * @param object $merge + * @param object $x + * @param object $y + * @param object $opacity + */ + private function merge($merge, $x = 0, $y = 0, $opacity = 100) { + imagecopymerge($this->image, $merge->getImage(), $x, $y, 0, 0, $merge->getWidth(), $merge->getHeight(), $opacity); + } + + /** + * + * + * @param string $color + * + * @return array + */ + private function html2rgb($color) { + if ($color[0] == '#') { + $color = substr($color, 1); + } + + if (strlen($color) == 6) { + list($r, $g, $b) = array($color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5]); + } elseif (strlen($color) == 3) { + list($r, $g, $b) = array($color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2]); + } else { + return false; + } + + $r = hexdec($r); + $g = hexdec($g); + $b = hexdec($b); + + return array($r, $g, $b); + } +}
\ No newline at end of file |