%PDF- %PDF-
| Direktori : /home1/lightco1/www/administrator/components/com_csvi/helper/ |
| Current File : //home1/lightco1/www/administrator/components/com_csvi/helper/image.php |
<?php
/**
* @package CSVI
* @subpackage Images
*
* @author Roland Dalmulder <contact@csvimproved.com>
* @copyright Copyright (C) 2006 - 2016 RolandD Cyber Produksi. All rights reserved.
* @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
* @link http://www.csvimproved.com
*/
defined('_JEXEC') or die;
/**
* Image helper.
*
* @package CSVI
* @subpackage Images
* @since 6.0
*/
class CsviHelperImage
{
/**
* Template helper
*
* @var CsviHelperTemplate
* @since 6.0
*/
private $template = null;
/**
* Logger helper
*
* @var CsviHelperLog
* @since 6.0
*/
private $log = null;
/**
* CSVI helper
*
* @var CsviHelperCsvi
* @since 6.0
*/
private $csvihelper = null;
/**
* List of known mime types
*
* @var array
* @since 3.0
*/
private $mimeTypes = array();
/**
* List of known image types
*
* @var array
* @since 3.0
*/
private $imageTypes = array();
/** @var array holds the mime types it found */
private $_found_mime_type = array();
/** @var array contains all the image data for processing */
private $_imagedata = array();
/** @var int $bg_red 0-255 - red color variable for background filler */
private $bg_red = 0;
/** @var int $bg_green 0-255 - green color variable for background filler */
private $bg_green = 0;
/** @var int $bg_blue 0-255 - blue color variable for background filler */
private $bg_blue = 0;
/** @var int $maxSize 0-1 - true/false - should thumbnail be filled to max pixels */
private $maxSize = false;
/** @var string $file the original file */
private $file = null;
/** @var string $file_extension the extension of the original file */
private $file_extension = null;
/** @var string $file_out the name of the file to be created */
private $file_out = null;
/** @var string $file_out_extension the extension of the file to be created */
public $file_out_extension = null;
/** @var int $file_out_width the width of the file to be generated */
private $file_out_width = 0;
/** @var int $file_out_height the height of the file to be generated */
private $file_out_height = 0;
/**
* Constructor.
*
* @since 6.0
*/
public function __construct(CsviHelperTemplate $template, CsviHelperLog $log, CsviHelperCsvi $csvihelper)
{
$this->template = $template;
$this->log = $log;
$this->csvihelper = $csvihelper;
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
$this->loadMimeTypes();
$this->loadImageTypes();
}
/**
* Check if the given file is an image.
*
* @param string $file Full path to file to check
* @param bool $remote True if the file to check is a remote file
*
* @return bool True if file is image | False if file is not an image.
*
* @since 3.0
*/
public function isImage($file, $remote=false)
{
$mime_type = $this->findMimeType($file, $remote);
if ($mime_type)
{
foreach ($this->imageTypes as $type)
{
if ($type['mime_type'] == $mime_type)
{
return true;
}
}
}
// If we get here, no image type has been found
return false;
}
/**
* Check a file for its mime type.
*
* @param string $filename The full location of the file to check
* @param bool $remote True if the file to check is a remote file
*
* @return mixed Mime type if found | False if no mime type is found.
*
* @since 3.0
*/
public function findMimeType($filename, $remote=false)
{
if ($remote || JFile::exists($filename))
{
if ($remote)
{
$filename = str_ireplace(' ', '%20', $filename);
}
$url_parts = @parse_url($filename);
if (isset($url_parts['scheme']) && substr($url_parts['scheme'], 0, 3) == 'ftp')
{
$host = $url_parts['host'];
if ($host)
{
$port = (isset($url_parts['port'])) ? $url_parts['port'] : 21;
$user = $url_parts['user'];
$pass = $url_parts['pass'];
$ftp = JClientFtp::getInstance($host, $port, array(), $user, $pass);
if ($ftp->read($url_parts['path'], $buffer))
{
$string = substr($buffer, 0, 20);
$max_length_found = 0;
foreach ($this->mimeTypes as $type)
{
if (stripos(bin2hex($string), $type['signature'], 0) !== false)
{
if (strlen($type['signature']) > $max_length_found)
{
$max_length_found = strlen($type['signature']);
if (isset($type['mime_type']))
{
$this->_found_mime_type['mime_type'] = $type['mime_type'];
return true;
}
}
}
}
}
}
$read = false;
}
else
{
$handle = @fopen($filename, "r");
if ($handle)
{
$string = fread($handle, 20);
$this->log->add('Identity string: ' . bin2hex($string), false);
$max_length_found = 0;
foreach ($this->mimeTypes as $type)
{
if (stripos(bin2hex($string), $type['signature'], 0) !== false)
{
if (strlen($type['signature']) > $max_length_found)
{
$max_length_found = strlen($type['signature']);
if (isset($type['mime_type']))
{
$this->_found_mime_type['mime_type'] = $type['mime_type'];
}
}
}
}
fclose($handle);
if (isset($this->_found_mime_type['mime_type']))
{
return $this->_found_mime_type['mime_type'];
}
else
{
return false;
}
}
$read = false;
}
if (!$read)
{
// Cannot open the image file, do a simple check
switch (strtolower(JFile::getExt($filename)))
{
case 'jpg':
case 'jpeg':
return 'image/jpeg';
break;
case 'png':
return 'image/png';
break;
case 'gif':
return 'image/gif';
break;
case 'bmp':
return 'image/bmp';
break;
default:
return false;
break;
}
}
}
else
{
return false;
}
}
/**
* List of known mime type signatures.
*
* @return void.
*
* @since 3.0
*/
private function LoadMimeTypes()
{
$this->mimeTypes[0]['signature'] = '474946383761';
$this->mimeTypes[1]['signature'] = '424D';
$this->mimeTypes[2]['signature'] = '4D5A';
$this->mimeTypes[3]['signature'] = '504B0304';
$this->mimeTypes[4]['signature'] = 'D0CF11E0A1B11AE1';
$this->mimeTypes[5]['signature'] = '0100000058000000';
$this->mimeTypes[6]['signature'] = '03000000C466C456';
$this->mimeTypes[7]['signature'] = '3F5F0300';
$this->mimeTypes[8]['signature'] = '1F8B08';
$this->mimeTypes[9]['signature'] = '28546869732066696C65';
$this->mimeTypes[10]['signature'] = '0000010000';
$this->mimeTypes[11]['signature'] = '4C000000011402';
$this->mimeTypes[12]['signature'] = '25504446';
$this->mimeTypes[13]['signature'] = '5245474544495434';
$this->mimeTypes[14]['signature'] = '7B5C727466';
$this->mimeTypes[15]['signature'] = 'lh';
$this->mimeTypes[16]['signature'] = 'MThd';
$this->mimeTypes[17]['signature'] = '0A050108';
$this->mimeTypes[18]['signature'] = '25215053';
$this->mimeTypes[19]['signature'] = '2112';
$this->mimeTypes[20]['signature'] = '1A02';
$this->mimeTypes[21]['signature'] = '1A03';
$this->mimeTypes[22]['signature'] = '1A04';
$this->mimeTypes[23]['signature'] = '1A08';
$this->mimeTypes[24]['signature'] = '1A09';
$this->mimeTypes[25]['signature'] = '60EA';
$this->mimeTypes[26]['signature'] = '41564920';
$this->mimeTypes[27]['signature'] = '425A68';
$this->mimeTypes[28]['signature'] = '49536328';
$this->mimeTypes[29]['signature'] = '4C01';
$this->mimeTypes[30]['signature'] = '303730373037';
$this->mimeTypes[31]['signature'] = '4352555348';
$this->mimeTypes[32]['signature'] = '3ADE68B1';
$this->mimeTypes[33]['signature'] = '1F8B';
$this->mimeTypes[34]['signature'] = '91334846';
$this->mimeTypes[35]['signature'] = '3C68746D6C3E';
$this->mimeTypes[36]['signature'] = '3C48544D4C3E';
$this->mimeTypes[37]['signature'] = '3C21444F4354';
$this->mimeTypes[38]['signature'] = '100';
$this->mimeTypes[39]['signature'] = '5F27A889';
$this->mimeTypes[40]['signature'] = '2D6C68352D';
$this->mimeTypes[41]['signature'] = '20006040600';
$this->mimeTypes[42]['signature'] = '00001A0007800100';
$this->mimeTypes[43]['signature'] = '00001A0000100400';
$this->mimeTypes[44]['signature'] = '20006800200';
$this->mimeTypes[45]['signature'] = '00001A0002100400';
$this->mimeTypes[46]['signature'] = '5B7665725D';
$this->mimeTypes[47]['signature'] = '300000041505052';
$this->mimeTypes[48]['signature'] = '1A0000030000';
$this->mimeTypes[49]['signature'] = '4D47582069747064';
$this->mimeTypes[50]['signature'] = '4D534346';
$this->mimeTypes[51]['signature'] = '4D546864';
$this->mimeTypes[52]['signature'] = '000001B3';
$this->mimeTypes[53]['signature'] = '0902060000001000B9045C00';
$this->mimeTypes[54]['signature'] = '0904060000001000F6055C00';
$this->mimeTypes[55]['signature'] = '7FFE340A';
$this->mimeTypes[56]['signature'] = '1234567890FF';
$this->mimeTypes[57]['signature'] = '31BE000000AB0000';
$this->mimeTypes[58]['signature'] = '1A00000300001100';
$this->mimeTypes[59]['signature'] = '7E424B00';
$this->mimeTypes[60]['signature'] = '504B0304';
$this->mimeTypes[61]['signature'] = '89504E470D0A';
$this->mimeTypes[62]['signature'] = '6D646174';
$this->mimeTypes[63]['signature'] = '6D646174';
$this->mimeTypes[64]['signature'] = '52617221';
$this->mimeTypes[65]['signature'] = '2E7261FD';
$this->mimeTypes[66]['signature'] = 'EDABEEDB';
$this->mimeTypes[67]['signature'] = '2E736E64';
$this->mimeTypes[68]['signature'] = '53495421';
$this->mimeTypes[69]['signature'] = '53747566664974';
$this->mimeTypes[70]['signature'] = '1F9D';
$this->mimeTypes[71]['signature'] = '49492A';
$this->mimeTypes[72]['signature'] = '4D4D2A';
$this->mimeTypes[73]['signature'] = '554641';
$this->mimeTypes[74]['signature'] = '57415645666D74';
$this->mimeTypes[75]['signature'] = 'D7CDC69A';
$this->mimeTypes[76]['signature'] = '4C000000';
$this->mimeTypes[77]['signature'] = '504B3030504B0304';
$this->mimeTypes[78]['signature'] = 'FF575047';
$this->mimeTypes[79]['signature'] = 'FF575043';
$this->mimeTypes[80]['signature'] = '3C3F786D6C';
$this->mimeTypes[81]['signature'] = 'FFFE3C0052004F004F0054005300540055004200';
$this->mimeTypes[82]['signature'] = '3C21454E54495459';
$this->mimeTypes[83]['signature'] = '5A4F4F20';
$this->mimeTypes[84]['signature'] = 'FFD8FFFE';
$this->mimeTypes[85]['signature'] = 'FFD8FFE0';
$this->mimeTypes[86]['signature'] = 'FFD8FFEE';
$this->mimeTypes[87]['signature'] = 'FFD8FFE1';
$this->mimeTypes[88]['signature'] = 'FFD8FFE2';
$this->mimeTypes[89]['signature'] = 'FFD8FFDB';
$this->mimeTypes[90]['signature'] = '474946383961';
// Extensions
$this->mimeTypes[0]['extension'] = '.gif';
$this->mimeTypes[1]['extension'] = '.bmp';
$this->mimeTypes[2]['extension'] = '.exe;.com;.386;.ax;.acm;.sys;.dll;.drv;.flt;.fon;.ocx;.scr;.lrc;.vxd;.cpl;.x32';
$this->mimeTypes[3]['extension'] = '.zip';
$this->mimeTypes[4]['extension'] = '.doc;.xls;.xlt;.ppt;.apr';
$this->mimeTypes[5]['extension'] = '.emf';
$this->mimeTypes[6]['extension'] = '.evt';
$this->mimeTypes[7]['extension'] = '.gid;.hlp;.lhp';
$this->mimeTypes[8]['extension'] = '.gz';
$this->mimeTypes[9]['extension'] = '.hqx';
$this->mimeTypes[10]['extension'] = '.ico';
$this->mimeTypes[11]['extension'] = '.lnk';
$this->mimeTypes[12]['extension'] = '.pdf';
$this->mimeTypes[13]['extension'] = '.reg';
$this->mimeTypes[14]['extension'] = '.rtf';
$this->mimeTypes[15]['extension'] = '.lzh';
$this->mimeTypes[16]['extension'] = '.mid';
$this->mimeTypes[17]['extension'] = '.pcx';
$this->mimeTypes[18]['extension'] = '.eps';
$this->mimeTypes[19]['extension'] = '.ain';
$this->mimeTypes[20]['extension'] = '.arc';
$this->mimeTypes[21]['extension'] = '.arc';
$this->mimeTypes[22]['extension'] = '.arc';
$this->mimeTypes[23]['extension'] = '.arc';
$this->mimeTypes[24]['extension'] = '.arc';
$this->mimeTypes[25]['extension'] = '.arj';
$this->mimeTypes[26]['extension'] = '.avi';
$this->mimeTypes[27]['extension'] = '.bz;.bz2';
$this->mimeTypes[28]['extension'] = '.cab';
$this->mimeTypes[29]['extension'] = '.obj';
$this->mimeTypes[30]['extension'] = '.tar;.cpio';
$this->mimeTypes[31]['extension'] = '.cru;.crush';
$this->mimeTypes[32]['extension'] = '.dcx';
$this->mimeTypes[33]['extension'] = '.gz;.tar;.tgz';
$this->mimeTypes[34]['extension'] = '.hap';
$this->mimeTypes[35]['extension'] = '.htm;.html';
$this->mimeTypes[36]['extension'] = '.htm;.html';
$this->mimeTypes[37]['extension'] = '.htm;.html';
$this->mimeTypes[38]['extension'] = '.ico';
$this->mimeTypes[39]['extension'] = '.jar';
$this->mimeTypes[40]['extension'] = '.lha';
$this->mimeTypes[41]['extension'] = '.wk1;.wks';
$this->mimeTypes[42]['extension'] = '.fm3';
$this->mimeTypes[43]['extension'] = '.wk3';
$this->mimeTypes[44]['extension'] = '.fmt';
$this->mimeTypes[45]['extension'] = '.wk4';
$this->mimeTypes[46]['extension'] = '.ami';
$this->mimeTypes[47]['extension'] = '.adx';
$this->mimeTypes[48]['extension'] = '.nsf;.ntf';
$this->mimeTypes[49]['extension'] = '.ds4';
$this->mimeTypes[50]['extension'] = '.cab';
$this->mimeTypes[51]['extension'] = '.mid';
$this->mimeTypes[52]['extension'] = '.mpg;.mpeg';
$this->mimeTypes[53]['extension'] = '.xls';
$this->mimeTypes[54]['extension'] = '.xls';
$this->mimeTypes[55]['extension'] = '.doc';
$this->mimeTypes[56]['extension'] = '.doc';
$this->mimeTypes[57]['extension'] = '.doc';
$this->mimeTypes[58]['extension'] = '.nsf';
$this->mimeTypes[59]['extension'] = '.psp';
$this->mimeTypes[60]['extension'] = '.zip';
$this->mimeTypes[61]['extension'] = '.png';
$this->mimeTypes[62]['extension'] = '.mov';
$this->mimeTypes[63]['extension'] = '.qt';
$this->mimeTypes[64]['extension'] = '.rar';
$this->mimeTypes[65]['extension'] = '.ra;.ram';
$this->mimeTypes[66]['extension'] = '.rpm';
$this->mimeTypes[67]['extension'] = '.au';
$this->mimeTypes[68]['extension'] = '.sit';
$this->mimeTypes[69]['extension'] = '.sit';
$this->mimeTypes[70]['extension'] = '.z';
$this->mimeTypes[71]['extension'] = '.tif;.tiff';
$this->mimeTypes[72]['extension'] = '.tif;.tiff';
$this->mimeTypes[73]['extension'] = '.ufa';
$this->mimeTypes[74]['extension'] = '.wav';
$this->mimeTypes[75]['extension'] = '.wmf';
$this->mimeTypes[76]['extension'] = '.lnk';
$this->mimeTypes[77]['extension'] = '.zip';
$this->mimeTypes[78]['extension'] = '.wpg';
$this->mimeTypes[79]['extension'] = '.wp';
$this->mimeTypes[80]['extension'] = '.xml';
$this->mimeTypes[81]['extension'] = '.xml';
$this->mimeTypes[82]['extension'] = '.dtd';
$this->mimeTypes[83]['extension'] = '.zoo';
$this->mimeTypes[84]['extension'] = '.jpeg;.jpe;.jpg';
$this->mimeTypes[85]['extension'] = '.jpeg;.jpe;.jpg';
$this->mimeTypes[86]['extension'] = '.jpeg;.jpe;.jpg';
$this->mimeTypes[87]['extension'] = '.jpeg;.jpe;.jpg';
$this->mimeTypes[88]['extension'] = '.jpeg;.jpe;.jpg';
$this->mimeTypes[89]['extension'] = '.jpeg;.jpe;.jpg';
$this->mimeTypes[90]['extension'] = '.gif';
// Descriptions
$this->mimeTypes[0]['description'] = 'GIF 87A';
$this->mimeTypes[1]['description'] = 'Windows Bitmap';
$this->mimeTypes[2]['description'] = 'Executable File ';
$this->mimeTypes[3]['description'] = 'Zip Compressed';
$this->mimeTypes[4]['description'] = 'MS Compound Document v1 or Lotus Approach APR file';
$this->mimeTypes[5]['description'] = 'xtended (Enhanced) Windows Metafile Format';
$this->mimeTypes[6]['description'] = 'Windows NT/2000 Event Viewer Log File';
$this->mimeTypes[7]['description'] = 'Windows Help File';
$this->mimeTypes[8]['description'] = 'GZ Compressed File';
$this->mimeTypes[9]['description'] = 'Macintosh BinHex 4 Compressed Archive';
$this->mimeTypes[10]['description'] = 'Icon File';
$this->mimeTypes[11]['description'] = 'Windows Link File';
$this->mimeTypes[12]['description'] = 'Adobe PDF File';
$this->mimeTypes[13]['description'] = 'Registry Data File';
$this->mimeTypes[14]['description'] = 'Rich Text Format File';
$this->mimeTypes[15]['description'] = 'Lzh compression file';
$this->mimeTypes[16]['description'] = 'Musical Instrument Digital Interface MIDI-sequention Sound';
$this->mimeTypes[17]['description'] = 'PC Paintbrush Bitmap Graphic';
$this->mimeTypes[18]['description'] = 'Adobe EPS File';
$this->mimeTypes[19]['description'] = 'AIN Archive File';
$this->mimeTypes[20]['description'] = 'ARC/PKPAK Compressed 1';
$this->mimeTypes[21]['description'] = 'ARC/PKPAK Compressed 2';
$this->mimeTypes[22]['description'] = 'ARC/PKPAK Compressed 3';
$this->mimeTypes[23]['description'] = 'ARC/PKPAK Compressed 4';
$this->mimeTypes[24]['description'] = 'ARC/PKPAK Compressed 5';
$this->mimeTypes[25]['description'] = 'ARJ Compressed';
$this->mimeTypes[26]['description'] = 'Audio Video Interleave (AVI)';
$this->mimeTypes[27]['description'] = 'Bzip Archive';
$this->mimeTypes[28]['description'] = 'Cabinet File';
$this->mimeTypes[29]['description'] = 'Compiled Object Module';
$this->mimeTypes[30]['description'] = 'CPIO Archive File';
$this->mimeTypes[31]['description'] = 'CRUSH Archive File';
$this->mimeTypes[32]['description'] = 'DCX Graphic File';
$this->mimeTypes[33]['description'] = 'Gzip Archive File';
$this->mimeTypes[34]['description'] = 'HAP Archive File';
$this->mimeTypes[35]['description'] = 'HyperText Markup Language 1';
$this->mimeTypes[36]['description'] = 'HyperText Markup Language 2';
$this->mimeTypes[37]['description'] = 'HyperText Markup Language 3';
$this->mimeTypes[38]['description'] = 'ICON File';
$this->mimeTypes[39]['description'] = 'JAR Archive File';
$this->mimeTypes[40]['description'] = 'LHA Compressed';
$this->mimeTypes[41]['description'] = 'Lotus 123 v1 Worksheet';
$this->mimeTypes[42]['description'] = 'Lotus 123 v3 FMT file';
$this->mimeTypes[43]['description'] = 'Lotus 123 v3 Worksheet';
$this->mimeTypes[44]['description'] = 'Lotus 123 v4 FMT file';
$this->mimeTypes[45]['description'] = 'Lotus 123 v5';
$this->mimeTypes[46]['description'] = 'Lotus Ami Pro';
$this->mimeTypes[47]['description'] = 'Lotus Approach ADX file';
$this->mimeTypes[48]['description'] = 'Lotus Notes Database/Template';
$this->mimeTypes[49]['description'] = 'Micrografix Designer 4';
$this->mimeTypes[50]['description'] = 'Microsoft CAB File Format';
$this->mimeTypes[51]['description'] = 'Midi Audio File';
$this->mimeTypes[52]['description'] = 'MPEG Movie';
$this->mimeTypes[53]['description'] = 'MS Excel v2';
$this->mimeTypes[54]['description'] = 'MS Excel v4';
$this->mimeTypes[55]['description'] = 'MS Word';
$this->mimeTypes[56]['description'] = 'MS Word 6.0';
$this->mimeTypes[57]['description'] = 'MS Word for DOS 6.0';
$this->mimeTypes[58]['description'] = 'Notes Database';
$this->mimeTypes[59]['description'] = 'PaintShop Pro Image File';
$this->mimeTypes[60]['description'] = 'PKZIP Compressed';
$this->mimeTypes[61]['description'] = 'PNG Image File';
$this->mimeTypes[62]['description'] = 'QuickTime Movie';
$this->mimeTypes[63]['description'] = 'Quicktime Movie File';
$this->mimeTypes[64]['description'] = 'RAR Archive File';
$this->mimeTypes[65]['description'] = 'Real Audio File';
$this->mimeTypes[66]['description'] = 'RPM Archive File';
$this->mimeTypes[67]['description'] = 'SoundMachine Audio File';
$this->mimeTypes[68]['description'] = 'Stuffit v1 Archive File';
$this->mimeTypes[69]['description'] = 'Stuffit v5 Archive File';
$this->mimeTypes[70]['description'] = 'TAR Compressed Archive File';
$this->mimeTypes[71]['description'] = 'TIFF (Intel)';
$this->mimeTypes[72]['description'] = 'TIFF (Motorola)';
$this->mimeTypes[73]['description'] = 'UFA Archive File';
$this->mimeTypes[74]['description'] = 'Wave Files';
$this->mimeTypes[75]['description'] = 'Windows Meta File';
$this->mimeTypes[76]['description'] = 'Windows Shortcut (Link File)';
$this->mimeTypes[77]['description'] = 'WINZIP Compressed';
$this->mimeTypes[78]['description'] = 'WordPerfect Graphics';
$this->mimeTypes[79]['description'] = 'WordPerfect v5 or v6';
$this->mimeTypes[80]['description'] = 'XML Document';
$this->mimeTypes[81]['description'] = 'XML Document (ROOTSTUB)';
$this->mimeTypes[82]['description'] = 'XML DTD';
$this->mimeTypes[83]['description'] = 'ZOO Archive File';
$this->mimeTypes[84]['description'] = 'JPG Graphic File';
$this->mimeTypes[85]['description'] = 'JPG Graphic File';
$this->mimeTypes[86]['description'] = 'JPG Graphic File';
$this->mimeTypes[87]['description'] = 'JPG Graphic File';
$this->mimeTypes[88]['description'] = 'JPG Graphic File';
$this->mimeTypes[89]['description'] = 'JPG Graphic File';
$this->mimeTypes[90]['description'] = 'GIF 89A';
// Mime descriptions
$this->mimeTypes[0]['mime_type'] = 'image/gif';
$this->mimeTypes[1]['mime_type'] = 'image/bmp';
$this->mimeTypes[2]['mime_type'] = '';
$this->mimeTypes[3]['mime_type'] = '';
$this->mimeTypes[4]['mime_type'] = '';
$this->mimeTypes[5]['mime_type'] = '';
$this->mimeTypes[6]['mime_type'] = '';
$this->mimeTypes[7]['mime_type'] = '';
$this->mimeTypes[8]['mime_type'] = '';
$this->mimeTypes[9]['mime_type'] = '';
$this->mimeTypes[10]['mime_type'] = '';
$this->mimeTypes[11]['mime_type'] = '';
$this->mimeTypes[12]['mime_type'] = 'application/pdf';
$this->mimeTypes[13]['mime_type'] = '';
$this->mimeTypes[14]['mime_type'] = '';
$this->mimeTypes[15]['mime_type'] = '';
$this->mimeTypes[16]['mime_type'] = '';
$this->mimeTypes[17]['mime_type'] = '';
$this->mimeTypes[18]['mime_type'] = '';
$this->mimeTypes[19]['mime_type'] = '';
$this->mimeTypes[20]['mime_type'] = '';
$this->mimeTypes[21]['mime_type'] = '';
$this->mimeTypes[22]['mime_type'] = '';
$this->mimeTypes[23]['mime_type'] = '';
$this->mimeTypes[24]['mime_type'] = '';
$this->mimeTypes[25]['mime_type'] = '';
$this->mimeTypes[26]['mime_type'] = '';
$this->mimeTypes[27]['mime_type'] = '';
$this->mimeTypes[28]['mime_type'] = '';
$this->mimeTypes[29]['mime_type'] = '';
$this->mimeTypes[30]['mime_type'] = '';
$this->mimeTypes[31]['mime_type'] = '';
$this->mimeTypes[32]['mime_type'] = '';
$this->mimeTypes[33]['mime_type'] = '';
$this->mimeTypes[34]['mime_type'] = '';
$this->mimeTypes[35]['mime_type'] = '';
$this->mimeTypes[36]['mime_type'] = '';
$this->mimeTypes[37]['mime_type'] = '';
$this->mimeTypes[38]['mime_type'] = '';
$this->mimeTypes[39]['mime_type'] = '';
$this->mimeTypes[40]['mime_type'] = '';
$this->mimeTypes[41]['mime_type'] = '';
$this->mimeTypes[42]['mime_type'] = '';
$this->mimeTypes[43]['mime_type'] = '';
$this->mimeTypes[44]['mime_type'] = '';
$this->mimeTypes[45]['mime_type'] = '';
$this->mimeTypes[46]['mime_type'] = '';
$this->mimeTypes[47]['mime_type'] = '';
$this->mimeTypes[48]['mime_type'] = '';
$this->mimeTypes[49]['mime_type'] = '';
$this->mimeTypes[50]['mime_type'] = '';
$this->mimeTypes[51]['mime_type'] = '';
$this->mimeTypes[52]['mime_type'] = '';
$this->mimeTypes[53]['mime_type'] = '';
$this->mimeTypes[54]['mime_type'] = '';
$this->mimeTypes[55]['mime_type'] = '';
$this->mimeTypes[56]['mime_type'] = '';
$this->mimeTypes[57]['mime_type'] = '';
$this->mimeTypes[58]['mime_type'] = '';
$this->mimeTypes[59]['mime_type'] = '';
$this->mimeTypes[60]['mime_type'] = '';
$this->mimeTypes[61]['mime_type'] = 'image/png';
$this->mimeTypes[62]['mime_type'] = '';
$this->mimeTypes[63]['mime_type'] = '';
$this->mimeTypes[64]['mime_type'] = '';
$this->mimeTypes[65]['mime_type'] = '';
$this->mimeTypes[66]['mime_type'] = '';
$this->mimeTypes[67]['mime_type'] = '';
$this->mimeTypes[68]['mime_type'] = '';
$this->mimeTypes[69]['mime_type'] = '';
$this->mimeTypes[70]['mime_type'] = '';
$this->mimeTypes[71]['mime_type'] = '';
$this->mimeTypes[72]['mime_type'] = '';
$this->mimeTypes[73]['mime_type'] = '';
$this->mimeTypes[74]['mime_type'] = '';
$this->mimeTypes[75]['mime_type'] = '';
$this->mimeTypes[76]['mime_type'] = '';
$this->mimeTypes[77]['mime_type'] = '';
$this->mimeTypes[78]['mime_type'] = '';
$this->mimeTypes[79]['mime_type'] = '';
$this->mimeTypes[80]['mime_type'] = '';
$this->mimeTypes[81]['mime_type'] = '';
$this->mimeTypes[82]['mime_type'] = '';
$this->mimeTypes[83]['mime_type'] = '';
$this->mimeTypes[84]['mime_type'] = 'image/jpeg';
$this->mimeTypes[85]['mime_type'] = 'image/jpeg';
$this->mimeTypes[86]['mime_type'] = 'image/jpeg';
$this->mimeTypes[87]['mime_type'] = 'image/jpeg';
$this->mimeTypes[88]['mime_type'] = 'image/jpeg';
$this->mimeTypes[89]['mime_type'] = 'image/jpeg';
$this->mimeTypes[90]['mime_type'] = 'image/gif';
}
/**
* List of known image types.
*
* @return void.
*
* @since 3.0
*/
private function loadImageTypes()
{
$this->imageTypes[0]['mime_type'] = 'image/gif';
$this->imageTypes[1]['mime_type'] = 'image/bmp';
$this->imageTypes[2]['mime_type'] = 'image/png';
$this->imageTypes[3]['mime_type'] = 'image/jpeg';
$this->imageTypes[4]['mime_type'] = 'image/jpeg';
$this->imageTypes[5]['mime_type'] = 'image/gif';
}
/**
* Convert/Resize an image.
*
* @param array $file_details Contains all the variables for creating a new image
*
* @return mixed Filename of created file if file has been created | false if file has not been created.
*
* @since 3.0
*/
public function convertImage($file_details)
{
// Set all details
foreach ($file_details as $type => $value)
{
switch ($type)
{
case 'maxsize':
if ($value)
{
$this->maxSize = true;
}
else
{
$this->maxSize = false;
}
break;
case 'bgred':
if ($file_details['bgred'] >= 0 || $file_details['bgred'] <= 255)
{
$this->bg_red = $file_details['bgred'];
}
else
{
$this->bg_red = 0;
}
break;
case 'bggreen':
if ($file_details['bggreen'] >= 0 || $file_details['bggreen'] <= 255)
{
$this->bg_green = $file_details['bggreen'];
}
else
{
$this->bg_green = 0;
}
break;
case 'bgblue':
if ($file_details['bgblue'] >= 0 || $file_details['bgblue'] <= 255)
{
$this->bg_blue = $file_details['bgblue'];
}
else
{
$this->bg_blue = 0;
}
break;
default:
$this->$type = $value;
break;
}
}
if ($this->newImgCreate())
{
return $this->file_out;
}
else
{
return false;
}
}
/**
* Create a new image.
*
* @return boolean True on success | False on failure.
*
* @since 3.0
*/
private function newImgCreate()
{
// Clear the cache
clearstatcache();
switch (strtolower($this->mime_type))
{
case 'image/gif':
if (function_exists('imagecreatefromgif'))
{
$orig_img = @imagecreatefromgif($this->file);
}
else
{
return false;
}
break;
case 'image/jpg':
case 'image/jpeg':
if (function_exists('imagecreatefromjpeg'))
{
$orig_img = @imagecreatefromjpeg($this->file);
}
else
{
return false;
}
break;
case 'image/png':
if (function_exists('imagecreatefrompng'))
{
$orig_img = @imagecreatefrompng($this->file);
}
else
{
return false;
}
break;
default:
return false;
break;
}
if ($orig_img)
{
$this->log->add('Save the new image', false);
// Save the new image
$img_resize = $this->NewImgSave($this->NewImgResize($orig_img));
// Clean up old image
ImageDestroy($orig_img);
}
else
{
$this->log->add('Cannot_read_original_image', false);
$img_resize = false;
}
if ($img_resize)
{
return true;
}
else
{
return false;
}
}
/**
* Resize the image.
*
* Includes function ImageCreateTrueColor and ImageCopyResampled which are available only under GD 2.0.1 or higher !
*
* @return mixed Image handler on success | False on failure.
*
* @since 3.0
*/
private function NewImgResize($orig_img)
{
$orig_size = getimagesize($this->file);
$maxX = $this->file_out_width;
$maxY = $this->file_out_height;
if ($orig_size[0] < $orig_size[1])
{
$this->file_out_width = $this->file_out_height * ($orig_size[0] / $orig_size[1]);
$adjustX = ($maxX - $this->file_out_width) / 2;
$adjustY = 0;
}
else
{
$this->file_out_height = $this->file_out_width / ($orig_size[0] / $orig_size[1]);
$adjustX = 0;
$adjustY = ($maxY - $this->file_out_height) / 2;
}
while ($this->file_out_width < 1 || $this->file_out_height < 1)
{
$this->file_out_width *= 2;
$this->file_out_height *= 2;
}
// See if we need to create an image at maximum size
if ($this->maxSize)
{
if (function_exists("imagecreatetruecolor"))
{
$im_out = imagecreatetruecolor($maxX, $maxY);
}
else
{
$im_out = imagecreate($maxX, $maxY);
}
if ($im_out)
{
// Need to image fill just in case image is transparent, don't always want black background
$bgfill = imagecolorallocate($im_out, $this->bg_red, $this->bg_green, $this->bg_blue);
if (function_exists("imageAntiAlias"))
{
imageAntiAlias($im_out, true);
}
imagealphablending($im_out, false);
if (function_exists("imagesavealpha"))
{
imagesavealpha($im_out, true);
}
if (function_exists("imagecolorallocatealpha"))
{
$transparent = imagecolorallocatealpha($im_out, 255, 255, 255, 127);
}
if (function_exists("imagecopyresampled"))
{
ImageCopyResampled($im_out, $orig_img, $adjustX, $adjustY, 0, 0, $this->file_out_width, $this->file_out_height, $orig_size[0], $orig_size[1]);
}
else
{
ImageCopyResized($im_out, $orig_img, $adjustX, $adjustY, 0, 0, $this->file_out_width, $this->file_out_height, $orig_size[0], $orig_size[1]);
}
}
else
{
return false;
}
}
else
{
if (function_exists("imagecreatetruecolor"))
{
$im_out = ImageCreateTrueColor($this->file_out_width, $this->file_out_height);
}
else
{
$im_out = imagecreate($this->file_out_width, $this->file_out_height);
}
if ($im_out)
{
if (function_exists("imageAntiAlias"))
{
imageAntiAlias($im_out, true);
}
imagealphablending($im_out, false);
if (function_exists("imagesavealpha"))
{
imagesavealpha($im_out, true);
}
if (function_exists("imagecolorallocatealpha"))
{
$transparent = imagecolorallocatealpha($im_out, 255, 255, 255, 127);
}
if (function_exists("imagecopyresampled"))
{
ImageCopyResampled($im_out, $orig_img, 0, 0, 0, 0, $this->file_out_width, $this->file_out_height, $orig_size[0], $orig_size[1]);
}
else
{
ImageCopyResized($im_out, $orig_img, 0, 0, 0, 0, $this->file_out_width, $this->file_out_height, $orig_size[0], $orig_size[1]);
}
}
else
{
return false;
}
}
return $im_out;
}
/**
* Save the new image.
*
* @param object $new_img The image handler
*
* @return bool True on success | False on failure.
*
* @since 3.0
*/
private function NewImgSave($new_img)
{
// Lets see if we need to rename the output file since we know the sizes
$this->log->add('File out extension: ' . $this->file_out_extension, false);
$this->log->add('File out: ' . $this->file_out, false);
switch (strtolower($this->file_out_extension))
{
case 'gif':
if (strtolower(substr($this->file_out, strlen($this->file_out) - 4, 4)) !== '.gif')
{
$this->file_out .= '.gif';
}
return imagegif($new_img, $this->file_out);
break;
case 'jpg':
if (strtolower(substr($this->file_out, strlen($this->file_out) - 4, 4)) !== '.jpg')
{
$this->file_out .= '.jpg';
}
return imagejpeg($new_img, $this->file_out, 100);
break;
case 'jpeg':
if (strtolower(substr($this->file_out, strlen($this->file_out) - 5, 5)) !== '.jpeg')
{
$this->file_out .= '.jpeg';
}
return imagejpeg($new_img, $this->file_out, 100);
break;
case 'png':
if (strtolower(substr($this->file_out, strlen($this->file_out) - 4, 4)) !== '.png')
{
$this->file_out .= '.png';
}
return imagepng($new_img, $this->file_out);
break;
default:
$this->log->add('No matching extension found', false);
return false;
break;
}
}
/**
* Process an image.
*
* @param string $name Full path and name of the image
* @param string $output_path The destination location of the image including trailing /
* @param string $output_name Name of the output image
*
* @return array An array with image data.
*
* @since 3.0
*/
public function processImage($name, $output_path, $output_name=null)
{
// Cleanup
$base = JPath::clean(JPATH_SITE, '/');
if (!empty($output_path))
{
$output_path = JPath::clean($output_path, '/');
}
$this->_imagedata = array();
$this->_imagedata['base'] = $base;
if ($this->isRemote($name))
{
$this->_imagedata['name'] = $name;
$this->_imagedata['isremote'] = true;
}
else
{
$this->_imagedata['name'] = $base . '/' . JPath::clean($name, '/');
$this->_imagedata['isremote'] = false;
}
$this->_imagedata['output_path'] = $output_path;
$this->_imagedata['output_name'] = (empty($output_name)) ? basename($name) : $output_name;
$this->_imagedata['extension'] = JFile::getExt($name);
$this->_imagedata['exists'] = false;
$this->_imagedata['isimage'] = false;
$this->_imagedata['mime_type'] = null;
// See if we need to handle a remote file
if ($this->_imagedata['isremote'])
{
$this->log->add('Process remote file: ' . $this->_imagedata['name'], false);
if ($this->csvihelper->fileExistsRemote($this->_imagedata['name']))
{
$this->_imagedata['exists'] = true;
// Check if this is an image or not
if ($this->isImage($this->_imagedata['name'], true))
{
$this->_imagedata['isimage'] = true;
}
}
else
{
$this->log->add('Remote file does not exist: ' . $this->_imagedata['name'], false);
$this->_imagedata['exists'] = false;
}
}
elseif (JFile::exists($this->_imagedata['name']))
{
$this->log->add('Process file: ' . $this->_imagedata['name'], false);
$this->_imagedata['exists'] = true;
// Check if this is an image or not
if ($this->isImage($this->_imagedata['name']))
{
$this->_imagedata['isimage'] = true;
}
}
else
{
// File does not exist
$this->log->add(JText::sprintf('COM_CSVI_DEBUG_FILE_NOT_FOUND', $this->_imagedata['name']), false);
$this->log->addStats('incorrect', JText::sprintf('COM_CSVI_DEBUG_FILE_NOT_FOUND', $this->_imagedata['name']));
return $this->_imagedata;
}
// Process if it is an image
if ($this->_imagedata['isimage'])
{
$this->log->add('Process image file', false);
// Clean up the images first
$this->cleanupImage();
// Convert the full image
if ($this->_imagedata['convert'])
{
$this->convertFullImage();
}
// Save the remote images on the server
if ($this->_imagedata['isremote'] && $this->template->get('save_images_on_server', 'image') && !$this->_imagedata['convert'])
{
// Sanitize filename
$this->_imagedata['output_name'] = $this->cleanFilename($this->_imagedata['output_name']);
$from = $this->_imagedata['name'];
$to = $this->_imagedata['base'] . '/' . $this->_imagedata['output_path'] . $this->_imagedata['output_name'];
// Check if the local file should be deleted
if (JFile::exists($to) && !$this->template->get('redownload_external_image', 'image'))
{
// Do not delete if the files are the same, otherwise the original image gets deleted. This is because
// the remote image is set to a local image in cleanupImage()
if ($from !== $to)
{
JFile::delete($from);
}
}
else
{
if ($from !== $to)
{
JFile::delete($to);
$this->log->add('Store remote file on server ' . $from . ' --> ' . $to, false);
JFile::move($from, $to);
}
}
}
elseif ($this->_imagedata['isremote'])
{
// Remove temporary file
JFile::delete($this->_imagedata['name']);
}
// Check if any images need to be renamed
$this->renameImage();
// Check if the full image needs to be resized
$this->resizeFullImage();
// Convert images
$this->imageTypeCheck();
}
else
{
if ($this->_imagedata['exists'])
{
$this->log->add(JText::sprintf('COM_CSVI_DEBUG_FILE_IS_NOT_IMAGE', $name));
// Non image details
$this->log->add(JText::_('COM_CSVI_DEBUG_PROCESS_NON_IMAGE'));
// Set the extension to the original extension
$this->_imagedata['output_name'] = JFile::stripExt($this->_imagedata['output_name']) . '.' . $this->_imagedata['extension'];
// Get more details
$this->collectFileDetails();
}
}
return $this->_imagedata;
}
/**
* Check if a file is a remote file or not
*
* @param string $path The full path to check
*
* Remote images can be located on an HTTP location or an FTP location.
*
* @return bool True if file is remote | False if file is not remote.
*
* @since 3.0
*/
public function isRemote($path)
{
if (substr(strtolower($path), 0, 4) == 'http')
{
return true;
}
elseif (substr(strtolower($path), 0, 3) == 'ftp')
{
return true;
}
else
{
return false;
}
}
/**
* Collect file details for non-image files.
*
* @return void.
*
* @since 2.3.10
*/
public function collectFileDetails()
{
$this->_imagedata['mime_type'] = $this->findMimeType($this->_imagedata['name']);
$this->_imagedata['isimage'] = 0;
// Clean up the images first
$this->cleanupImage();
// Save the remote images on the server
if ($this->_imagedata['isremote'] && $this->template->get('save_images_on_server', 'image'))
{
// Sanitize filename
$this->_imagedata['output_name'] = $this->cleanFilename($this->_imagedata['output_name']);
$from = $this->_imagedata['name'];
$to = $this->_imagedata['base'] . '/' . $this->_imagedata['output_path'] . $this->_imagedata['output_name'];
// Check if the local file should be deleted
if (JFile::exists($to) && !$this->template->get('redownload_external_image', 'image'))
{
JFile::delete($from);
}
else
{
JFile::delete($to);
$this->log->add('Store remote file on server ' . $from . ' --> ' . $to, false);
JFile::move($from, $to);
}
}
}
/**
* Create a thumbnail image.
*
* @param string $original The full path and name of the large image
* @param string $output_path The path to store the thumbnail
* @param string $output_name The name of the thumbnail
*
* @return mixed Full thumbnail path and name on success | False on failure.
*
* @since 4.0
*/
public function createThumbnail($original, $output_path, $output_name)
{
$base = JPath::clean(JPATH_SITE, '/');
// Make sure the thumbnail is the same file type as the full image
if ($this->template->get('thumb_check_filetype', 'image') && JFile::getExt($original) != JFile::getExt($output_name))
{
$output_name = JFile::stripExt($output_name) . '.' . JFile::getExt($original);
}
// Clean up the output name
$output_name = $this->setCase($output_name);
// Check if the original is an external image
if (!$this->isRemote($original))
{
$original = $base . '/' . $original;
$file_exists = JFile::exists($original);
$remote = false;
}
else
{
$file_exists = $this->csvihelper->fileExistsRemote($original);
$remote = true;
}
// Check if thumbsize is greater than 0
if ($this->template->get('thumb_width') >= 1 && $this->template->get('thumb_height') >= 1)
{
// Check if the image folders exists
$thumb_folder = JPATH_SITE . '/' . $output_path . dirname($output_name);
if (!JFolder::exists($thumb_folder))
{
$this->log->add('Create thumbnail folder: ' . $thumb_folder);
JFolder::create($thumb_folder);
}
// Check if the target thumb exists, if yes delete it
if (JFile::exists($base . '/' . $output_path . $output_name))
{
JFile::delete($base . '/' . $output_path . $output_name);
}
// Check if the original file exists
$this->log->add('Check original file: ' . $original, false);
if ($file_exists)
{
// Collect all thumbnail details
$thumb_file_details = array();
$thumb_file_details['file'] = $original;
$thumb_file_details['file_extension'] = JFile::getExt($original);
$thumb_file_details['file_out'] = $base . '/' . $output_path . $output_name;
$thumb_file_details['maxsize'] = 0;
$thumb_file_details['bgred'] = 255;
$thumb_file_details['bggreen'] = 255;
$thumb_file_details['bgblue'] = 255;
$thumb_file_details['file_out_width'] = $this->template->get('thumb_width', 'image');
$thumb_file_details['file_out_height'] = $this->template->get('thumb_height', 'image');
$thumb_file_details['file_out_extension'] = JFile::getExt($output_name);
$thumb_file_details['mime_type'] = $this->findMimeType($original, $remote);
// We need to resize the image and Save the new one only if it is in a different location
$this->log->add('Create thumbnail from ' . $original . ' to ' . $thumb_file_details['file_out'], false);
if ($original != $thumb_file_details['file_out'])
{
$new_img = $this->convertImage($thumb_file_details);
// Check if an image was created
if ($new_img)
{
// Get the details of the thumb image
if (JFile::exists($new_img))
{
$this->log->add('Thumbnail created', false);
return $output_path . $output_name;
}
else
{
$this->log->add('Thumbnail has not been created because the file ' . $new_img . ' does not exist', false);
return false;
}
}
else
{
$this->log->add('Thumnail has not been created because the image cannot be converted', false);
return false;
}
}
else
{
$this->log->add('Thumbnail is the same file and location as the original file', false);
$this->log->AddStats('incorrect', 'COM_CSVI_THUMB_SAME_AS_FULL');
return false;
}
}
else
{
$this->log->add('File ' . $original . ' doest no exist, nothing to do', false);
$this->log->AddStats('nofiles', JText::sprintf('COM_CSVI_FILE_DOES_NOT_EXIST_NOTHING_TO_DO', $original));
return false;
}
}
else
{
$this->log->add('Thumbnail size is too small', false);
$this->log->AddStats('incorrect', 'COM_CSVI_THUMBNAIL_SIZE_TOO_SMALL');
return false;
}
}
/**
* Clean up the full image
*
* Clean up the image from any incorrect paths
*
* Minimum requirement is PHP 5.2.0
*
* [full_image] => Array
* (
* [isremote] => 1
* [exists] => 1
* [isimage] => 1
* [name] => R05-01 -- R05-01 (700).jpg
* [filename] => R05-01 -- R05-01 (700)
* [extension] => jpg
* [folder] => http://csvi3
* [output_name] => R05-01 -- R05-01 (700).jpg
* [output_filename] => R05-01 -- R05-01 (700)
* [output_extension] => jpg
* [output_folder] => http://csvi3
* [mime_type] => image/jpeg
* ).
*
* @return void.
*
* @since 3.0
*/
private function cleanupImage()
{
if ($this->_imagedata['isremote'] && $this->template->get('save_images_on_server', 'image'))
{
// Check if we need to re-download the image
$curfile = JPATH_SITE . '/' . $this->_imagedata['output_path'] . $this->_imagedata['output_name'];
$this->log->add('Current file: ' . $curfile, false);
// Check if the local file doet not exist or if it does but the user wants us to redownload the file
if (!JFile::exists($curfile) || (JFile::exists($curfile) && $this->template->get('redownload_external_image', 'image')))
{
// Collect remote file information
$local_image = CSVIPATH_TMP . '/' . $this->cleanFilename(basename($this->_imagedata['name']));
// Store the remote image
if ($this->storeRemoteImage($this->_imagedata['name'], $local_image))
{
$this->log->add('Remote file stored: ' . $this->_imagedata['name'] . ' --> ' . $local_image, false);
// Update full image information
$this->_imagedata['name'] = $local_image;
// Get the mime type
$mime_type = $this->findMimeType($local_image);
}
else
{
$this->log->AddStats('nofiles', JText::sprintf('COM_CSVI_REMOTE_FILE_NOT_FOUND', $this->_imagedata['name']));
$this->log->add(JText::sprintf('COM_CSVI_REMOTE_FILE_NOT_FOUND', $this->_imagedata['name']), false);
}
}
else
{
$mime_type = $this->findMimeType($curfile);
$this->_imagedata['name'] = $this->_imagedata['output_path'] . $this->_imagedata['output_name'];
}
}
elseif ($this->_imagedata['isremote'])
{
$mime_type = $this->findMimeType($this->_imagedata['name'], true);
$this->_imagedata['output_path'] = dirname($this->_imagedata['name']) . '/';
}
elseif (!$this->_imagedata['isremote'])
{
$mime_type = $this->findMimeType($this->_imagedata['name']);
}
// Set the mime type
$this->log->add('Mime type found: ' . $mime_type, false);
$this->_imagedata['mime_type'] = $mime_type;
// Validate extension against mime type
$type = '';
$ext = '';
$mime_details = explode('/', $mime_type);
if (isset($mime_details[0]))
{
$type = $mime_details[0];
}
if (isset($mime_details[1]))
{
$ext = $mime_details[1];
}
if ($ext == 'jpeg')
{
$ext = 'jpg';
}
// Get the extension of the target image name
$output_ext = JFile::getExt($this->_imagedata['output_name']);
if ($ext != strtolower($output_ext))
{
$this->log->add('Source extension is ' . $ext . ' and target extension is ' . $output_ext, false);
// Fix up the new names
$basename = basename($this->_imagedata['name'], $output_ext);
$to = dirname($this->_imagedata['name']) . '/' . $basename . $ext;
// Rename the file
if (JFile::exists($this->_imagedata['name']))
{
$this->log->add('Renaming full image because bad extension: ' . $this->_imagedata['name'] . ' --> ' . $to, false);
if (!JFile::move($this->_imagedata['name'], $to))
{
return false;
}
else
{
$this->_imagedata['name'] = $to;
}
}
}
// Check for a valid extenion
if (empty($this->_imagedata['extension']) && $type === 'image')
{
$this->_imagedata['extension'] = $ext;
}
// Set a new extension if the image needs to be converted
$convert_type = $this->template->get('convert_type', 'image');
if ($convert_type !== 'none' && $convert_type !== $this->_imagedata['extension'])
{
// @todo Hier gaat het fout als de naam is gegeneerd op basis van SKU
// Check if the name is generated
if ($this->template->get('auto_generate_image_name', 'image', false))
{
$this->_imagedata['output_name'] = JFile::stripExt(basename($this->_imagedata['output_name'])) . '.' . $convert_type;
}
else
{
$this->_imagedata['output_name'] = JFile::stripExt(basename($this->_imagedata['name'])) . '.' . $convert_type;
}
$this->_imagedata['convert'] = true;
}
else
{
$this->_imagedata['convert'] = false;
}
// Set the file case
$this->_imagedata['output_name'] = $this->setCase($this->_imagedata['output_name']);
// Add some debug info
$this->log->add('Full name original: ' . $this->_imagedata['name'], false);
$this->log->add('Full name target: ' . $this->_imagedata['output_path'] . $this->_imagedata['output_name'], false);
}
/**
* Store a remote image on the local server.
*
* @param string $remote_image The url of the remote image
* @param string $local_image The full path and file name of the image to store
*
* @return bool True if remote file was locally written | False if remote file was not locally written.
*
* @since 3.0
*/
private function storeRemoteImage($remote_image, $local_image)
{
// Fix spaces in the remote image
$remote_image = str_replace(' ', '%20', $remote_image);
// Suppress any warnings as it breaks the import process
$url_parts = @parse_url($remote_image);
if (substr($url_parts['scheme'], 0, 4) == 'http')
{
// Suppress any warnings as it breaks the import process
$remote_image_data = @file_get_contents($remote_image);
return JFile::write($local_image, $remote_image_data);
}
elseif (substr($url_parts['scheme'], 0, 3) == 'ftp')
{
$host = $url_parts['host'];
if ($host)
{
$port = (isset($url_parts['port'])) ? $url_parts['port'] : 21;
$user = $url_parts['user'];
$pass = $url_parts['pass'];
$ftp = JClientFtp::getInstance($host, $port, array(), $user, $pass);
$buffer = '';
if ($ftp->read($url_parts['path'], $buffer))
{
return JFile::write($local_image, $buffer);
}
return false;
}
return false;
}
return false;
}
/**
* Convert the full image to another type.
*
* @return bool True on success | False on failure.
*
* @since 3.0
*/
private function convertFullImage()
{
// Let's see if the extensions are the same
if ($this->_imagedata['convert'] && ($this->_imagedata['isremote'] && $this->template->get('save_images_on_server', 'image')))
{
// Collect the image details
$file_details = array();
$file_details['file'] = $this->_imagedata['name'];
$file_details['file_extension'] = JFile::getExt($this->_imagedata['name']);
$file_details['file_out'] = $this->_imagedata['base'] . '/' . $this->_imagedata['output_path'] . $this->_imagedata['output_name'];
$file_details['maxsize'] = 0;
$file_details['bgred'] = 255;
$file_details['bggreen'] = 255;
$file_details['bgblue'] = 255;
$new_sizes = getimagesize($this->_imagedata['name']);
$file_details['file_out_width'] = $new_sizes[0];
$file_details['file_out_height'] = $new_sizes[1];
$file_details['file_out_extension'] = JFile::getExt($this->_imagedata['output_name']);
$file_details['mime_type'] = $this->_imagedata['mime_type'];
// We need to resize the image and Save the new one (all done in the constructor)
$this->log->add(JText::sprintf('COM_CSVI_DEBUG_CONVERT_IMAGE', $file_details['file'], $file_details['file_out']));
$new_img = $this->convertImage($file_details);
if ($new_img)
{
$this->log->add(JText::sprintf('COM_CSVI_IMAGE_CONVERTED', $file_details['file']));
// See if we need to keep the old image
if (!$this->template->get('keep_original', 'image') && JFile::exists($file_details['file']))
{
JFile::delete($file_details['file']);
}
// We have a new name, so refresh the info
$this->_imagedata['name'] = dirname($this->_imagedata['name']) . '/' . $this->_imagedata['output_name'];
$this->_imagedata['mime_type'] = $this->findMimeType(
$this->_imagedata['base'] . '/' . $this->_imagedata['output_path'] . $this->_imagedata['output_name']
);
return true;
}
else
{
$this->log->add('Image not converted', false);
return false;
}
}
else
{
return false;
}
}
/**
* Rename image
*
* Rename an image, any existing file will be deleted.
*
* @return void.
*
* @since 3.0
*/
private function renameImage()
{
if (!$this->_imagedata['isremote']
&& $this->template->get('auto_generate_image_name')
&& $this->template->get('convert_type') === 'none'
&& (basename($this->_imagedata['name']) !== $this->_imagedata['output_name']))
{
$from = $this->_imagedata['name'];
if (JFile::exists($from))
{
$to = $this->_imagedata['base'] . '/' . $this->_imagedata['output_path'] . $this->_imagedata['output_name'];
$this->log->add('Rename the full file from ' . $from . ' to ' . $to, false);
// Delete existing target image
if (JFile::exists($to))
{
JFile::delete($to);
}
// Check if the user wants to keep the original
if ($this->template->get('keep_original'))
{
// Rename the image
JFile::copy($from, $to);
}
else
{
// Rename the image
JFile::move($from, $to);
}
}
else
{
$this->log->add(JText::sprintf('COM_CSVI_RENAME_FULL_FILE_NOT_FOUND', $from), false);
}
}
}
/**
* Check if we need to convert the final image based on mime type.
*
* @return void.
*
* @since 2.3.7
*/
private function imageTypeCheck()
{
// Get the output mime-type
$output_ext = JFile::getExt($this->_imagedata['output_name']);
if ($output_ext == 'jpg')
{
$mime_ext = 'jpeg';
}
else
{
$mime_ext = $output_ext;
}
// Check if the mime-type is different and if so, convert image
if (!$this->_imagedata['isremote'] && JFile::exists($this->_imagedata['name']) && !stristr($this->_imagedata['mime_type'], $mime_ext))
{
$file_details = array();
$file_details['file'] = $this->_imagedata['name'];
$file_details['file_extension'] = JFile::getExt($this->_imagedata['name']);
$file_details['maxsize'] = 0;
$file_details['bgred'] = 255;
$file_details['bggreen'] = 255;
$file_details['bgblue'] = 255;
$file_details['file_out'] = $this->_imagedata['base'] . '/' . $this->_imagedata['output_path'] . $this->_imagedata['output_name'];
$new_sizes = getimagesize($this->_imagedata['name']);
$file_details['file_out_width'] = $new_sizes[0];
$file_details['file_out_height'] = $new_sizes[1];
$file_details['file_out_extension'] = $output_ext;
$file_details['mime_type'] = $this->_imagedata['mime_type'];
// We need to resize the image and Save the new one (all done in the constructor)
$this->log->add('Convert ' . $file_details['file'] . ' to ' . $file_details['file_out'], false);
$new_img = $this->convertImage($file_details);
if ($new_img)
{
$this->log->add(JText::sprintf('COM_CSVI_IMAGE_CONVERTED', $file_details['file']));
}
else
{
$this->log->add(JText::sprintf('COM_CSVI_IMAGE_NOT_CONVERTED', $file_details['file']));
}
}
// We have a remote image, update the mime type since we can't convert images on remote servers
elseif ($this->_imagedata['isremote'])
{
$mime_type = $this->findMimeType($this->_imagedata['output_path'] . $this->_imagedata['output_name'], true);
if ($mime_type)
{
$this->_imagedata['mime_type'] = $mime_type;
}
else
{
$this->log->add(JText::_('COM_CSVI_CANNOT_FIND_REMOTE_MIMETYPE'));
}
}
}
/**
* Clean filename
*
* Cleans up a filename and replaces non-supported characters with an underscore.
*
* @param string $value The value to clean
*
* @return string The cleaned filename.
*
* @since 3.0
*/
private function cleanFilename($value)
{
$output = (string) preg_replace('/[^A-Z0-9_\.\s-]/i', '_', $value);
return $output;
}
/**
* Change the case of any given string.
*
* @param string $name The string to be case changed
*
* @return string The case changed string.
*
* @since 3.0
*/
private function setCase($name)
{
// Set the case if needed
switch ($this->template->get('change_case', 'image'))
{
case 'lcase':
return strtolower($name);
break;
case 'ucase':
return strtoupper($name);
break;
case 'ucfirst':
return ucfirst($name);
break;
case 'ucwords':
return ucwords($name);
break;
default:
return $name;
break;
}
}
/**
* Resize a large image.
*
* @return void.
*
* @since 3.0
*/
private function resizeFullImage()
{
// Check if we need to resize the full image
if ($this->template->get('full_resize', 'image'))
{
// Get the current size
$checkfile = $this->_imagedata['base'] . '/' . $this->_imagedata['output_path'] . $this->_imagedata['output_name'];
if (JFile::exists($checkfile))
{
$cur_size = getimagesize($checkfile);
if ($cur_size[0] > $this->template->get('full_width', 'image') || $cur_size[1] > $this->template->get('full_height', 'image'))
{
// Create a temporary file to work on
JFile::copy($checkfile, CSVIPATH_TMP . '/' . $this->_imagedata['output_name']);
// Resize the image
$file_details = array();
$file_details['file'] = CSVIPATH_TMP . '/' . $this->_imagedata['output_name'];
$file_details['file_extension'] = JFile::getExt($checkfile);
$file_details['rename'] = 0;
$file_details['file_out'] = $checkfile;
$file_details['maxsize'] = 0;
$file_details['bgred'] = 255;
$file_details['bggreen'] = 255;
$file_details['bgblue'] = 255;
$file_details['file_out_width'] = $this->template->get('full_width', 'image');
$file_details['file_out_height'] = $this->template->get('full_height', 'image');
$file_details['file_out_extension'] = JFile::getExt($checkfile);
$file_details['mime_type'] = $this->_imagedata['mime_type'];
// We need to resize the image and Save the new one (all done in the constructor)
$this->log->add(
JText::sprintf(
'COM_CSVI_DEBUG_RESIZE_IMAGE',
$file_details['file'], $cur_size[1] . 'x' . $cur_size[0], $this->template->get('full_height') . 'x' . $this->template->get('full_width')
)
);
JFile::delete($checkfile);
$new_img = $this->convertImage($file_details);
// Delete the temporary file
JFile::delete(CSVIPATH_TMP . '/' . $this->_imagedata['output_name']);
if ($new_img)
{
$this->log->add(JText::_('COM_CSVI_FULL_IMAGE_RESIZED'));
}
}
}
}
}
/**
* Add a watermark to an image.
*
* @param string $imagename The full path of the image to watermark
*
* @return bool True on success | False on failure.
*
* @since 4.2
*/
public function addWatermark($imagename)
{
$watermark = JPATH_SITE . '/' . $this->template->get('full_watermark_image');
$result = false;
// Clear the cache
clearstatcache();
// Check if the files exist
if (file_exists($imagename) && file_exists($watermark))
{
$mime_image = $this->findMimeType($imagename);
$this->log->add('Mime image:' . $mime_image, false);
$image = $this->createImage($mime_image, $imagename);
$ext = JFile::getExt($imagename);
if ($image)
{
$mime_stamp = $this->findMimeType($watermark);
$this->log->add('Mime stamp:' . $mime_stamp, false);
$stamp = $this->createImage($mime_stamp, $watermark);
// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = $this->template->get('full_watermark_right');
$marge_bottom = $this->template->get('full_watermark_bottom');
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// Copy the stamp image onto our photo using the margin offsets and the photo
// width to calculate positioning of the stamp.
imagecopy($image, $stamp, imagesx($image) - $sx - $marge_right, imagesy($image) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
// Save the new image
switch ($ext)
{
case "gif":
$result = imagegif($image, $imagename);
break;
case "jpg":
case "jpeg":
$result = imagejpeg($image, $imagename, 100);
break;
case "png":
$result = imagepng($image, $imagename);
break;
default:
$this->log->add('No file extension found', false);
break;
}
imagedestroy($image);
}
else
{
$this->log->add('Cannot create watermark file', false);
}
}
else
{
$this->log->add('Files ' . $imagename . ' and ' . $watermark . ' do not exist', false);
return false;
}
return $result;
}
/**
* Create an image object.
*
* @param string $mime_type The mime type of the image
* @param string $imagename The full path image to create
*
* @return mixed Image resource on success | False on failure.
*
* @since 4.2
*/
private function createImage($mime_type, $imagename)
{
$image = null;
switch ($mime_type)
{
case 'image/gif':
if (function_exists('imagecreatefromgif'))
{
$image = @imagecreatefromgif($imagename);
}
else
{
return false;
}
break;
case 'image/jpg':
case 'image/jpeg':
if (function_exists('imagecreatefromjpeg'))
{
$image = @imagecreatefromjpeg($imagename);
}
else
{
return false;
}
break;
case 'image/png':
if (function_exists('imagecreatefrompng'))
{
$image = @imagecreatefrompng($imagename);
}
else
{
return false;
}
break;
default:
return false;
break;
}
return $image;
}
}