shop-old/libs/phImaginator/phImaginator.class.php
2026-04-20 01:03:43 +02:00

288 lines
7.1 KiB
PHP

<?php
/**
* R&S Imagination Suite
*
* blah fasel description
*
* @author Darius A. Zylka <rs@regen-sonne.de>
* @copyright (c) 2009 Darius A. Zylka
* @version 1.0
* @package phImaginator
*/
/**
* Main class
*
* @package phImaginator
*
*/
class phImaginator {
const POSITION_LEFT = 1;
const POSITION_CENTER = 2;
const POSITION_RIGHT = 4;
const POSITION_TOP = 8;
const POSITION_MIDDLE = 16;
const POSITION_BOTTOM = 32;
const POSITION_LEFT_TOP = 64;
const POSITION_RIGHT_TOP = 128;
const POSITION_LEFT_BOTTOM = 256;
const POSITION_RIGHT_BOTTOM = 512;
const POSITION_ALL = 1024;
const FITTING_WIDTH = 2048;
const FITTING_HEIGHT = 4096;
const FITTING_BOTH = 8192;
const TRANSITION_LINEAR = 1;
const TRANSITION_LOGARITHMIC = 2;
const TRANSITION_EXPONENTIAL = 3;
/**
* An array with all image data like resources, width, height, filename
*
* @access public
* @var array
*/
public $imageSourceCollection = array();
/**
* Incremental counter of all added images
*
* @access private
* @var integer
*/
private $resource_counter = 0;
/**
* Holds the additional file name for the generated images
*
* @access private
* @var string
*/
private $nameAppend = false;
private $namePrepend = false;
/**
* Constructor
* Includes the module interface and the module parent class
*
*/
public function __construct() {
require_once 'phImaginator.Module.interface.php';
require_once 'phImaginator.Universal.class.php';
//phImaginator_Universal::setGlobalConstants();
}
/**
* Adds new images resources
*
* @access public
* @param mixed $source An array containing files or directories or a string with a file or directory name
*/
public function add($source) {
if (is_array($source)) {
foreach ($source as $source_file) {
$this->addSource($source_file);
}
} else {
$this->addSource($source);
}
}
/**
* Checks if given resource is a file or a directory
*
* @access private
* @param string $source A file or directory name
*/
private function addSource($source) {
if (is_file($source)) {
$this->addImage($source);
} else if (is_dir($source) && $dh = opendir($source)) {
$source .= (substr($source, -1, 1) != '/') ? '/' : '';
while (($file = readdir($dh)) !== false) {
$sourcefile = $source . $file;
if (is_file($sourcefile)) {
$this->addImage($sourcefile);
}
}
closedir($dh);
}
}
/**
* Generates an image resource and adds it to the collection
*
* @access private
* @param string $source_file
* @uses $imageSourceCollection
*/
private function addImage($source_file) {
list($width, $height, $type) = getimagesize($source_file);
switch ($type) {
case IMAGETYPE_JPEG:
$resource = imagecreatefromjpeg($source_file);
break;
case IMAGETYPE_PNG:
$resource = imagecreatefrompng($source_file);
imagesavealpha($resource, true);
break;
case IMAGETYPE_GIF:
$resource = imagecreatefromgif($source_file);
break;
default:
break;
}
if (isset($resource) && is_resource($resource)) {
++$this->resource_counter;
$fileinfo = pathinfo($source_file);
$this->imageSourceCollection[$this->resource_counter] = array(
'width' => $width,
'height' => $height,
'resource' => $resource,
'id' => $this->resource_counter,
'type' => $type,
'fileinfo' => $fileinfo
);
}
}
/**
* Includes the module class file and calls its desired method
*
* @access public
* @param string $action Name of the class and its desired method
* @param array $params Given parameters
*/
public function __call($action, $params) {
$classCall = explode('_', $action);
$class = $classCall[0];
$method = $classCall[1];
if (!is_object($this->$class)) {
require_once 'phImaginator.' . $class . '.class.php';
$className = 'phImaginator_' . $class;
}
if ($className::ifRunCollected()) {
$className::assignImageSourceCollection($this->imageSourceCollection);
$className::$method($params);
} else {
if (is_array($this->imageSourceCollection)) {
foreach ($this->imageSourceCollection as $id => &$source_data) {
// $className::$method($source_data, $params);
// $tmp_params = $params;
phImaginator_Universal::setCurrentResource($source_data);
// array_unshift($params, &$source_data);
call_user_func_array(array($className, $method), $params);
// $params = $tmp_params;
}
}
}
return $this;
}
/**
* Adds an additional name for the generated image files
*
* @access public
* @param string $nameAdd Prefix for the new file name
* @uses $nameAdd
*/
public function nameAdd($namePrepend = false, $nameAppend = false) {
$this->nameAppend = $nameAppend;
$this->namePrepend = $namePrepend;
}
/**
* Walks through the collection and calls the saving method for each element
*
* @access public
* @param mixed $imagetype One of the Exif Imagetype Constants
* @param integer $quality A value between 0 (high compression level, pure quality) and 100 (no compression, best possible quality)
* @uses $imageSourceCollection
*/
public function save($imagetype = false, $quality = 85, $destination = false) {
if (is_array($this->imageSourceCollection)) {
foreach ($this->imageSourceCollection as $source_data) {
$this->saveImage($source_data, $imagetype, $quality, $destination);
}
}
}
/**
* Writes the image to file system
*
* @access private
* @param array $source_data
* @param mixed $imagetype One of the Exif Imagetype Constants
* @param quality $quality
*/
private function saveImage($source_data, $imagetype = false, $quality = 85, $destination = false) {
$source_data['type'] = (!$imagetype) ? $source_data['type'] : $imagetype;
$destination = ($destination) ? $destination : $source_data['fileinfo']['dirname'];
switch ($source_data['type']) {
case IMAGETYPE_JPEG:
imagejpeg($source_data['resource'], $destination . DIRECTORY_SEPARATOR . $this->namePrepend . $source_data['fileinfo']['filename'] . $this->nameAppend . '.jpg', $quality);
break;
case IMAGETYPE_PNG:
imagealphablending($source_data['resource'], false);
imagesavealpha($source_data['resource'], true);
$q = (-$quality + 100) * 0.1;
$quality = floor(($q > 9) ? 9 : $q);
imagepng($source_data['resource'], $destination . DIRECTORY_SEPARATOR . $this->namePrepend . $source_data['fileinfo']['filename'] . $this->nameAppend . '.png', $quality);
break;
case IMAGETYPE_GIF:
imagegif($source_data['resource'], $destination . DIRECTORY_SEPARATOR . $this->namePrepend . $source_data['fileinfo']['filename'] . $this->nameAppend . '.gif');
break;
}
}
/**
* Sets the font informations for usage in modules
*
* @param string $fontFile Path and name to the TTF file
* @param integer $size Font size
* @param mixed $color An array or hex value for the color (array(R, G, B) or #RRGGBB)
* @param integer $lucency An value between 0 and 100 for the lucency of the written text
*/
public function setFont($fontFile, $size = false, $color = false, $lucency = false) {
phImaginator_Universal::setFont($fontFile, $size, $color, $lucency);
}
}
?>