Current Directory: /home/astoriaah/www/old15/components/com_jce/editor/libraries/pro/classes
Viewing File: /home/astoriaah/www/old15/components/com_jce/editor/libraries/pro/classes/manager.php
<?php
/**
* @copyright Copyright (c) 2009-2017 Ryan Demmer. All rights reserved
* @license GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* JCE is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses
*/
defined('_JEXEC') or die('RESTRICTED');
// set as an extension parent
if (!defined('_WF_EXT')) {
define('_WF_EXT', 1);
}
require_once WF_EDITOR_LIBRARIES . '/classes/manager/base.php';
// load image processor class
require_once dirname(__FILE__) . '/editor.php';
class WFMediaManager extends WFMediaManagerBase
{
public $can_edit_images = 0;
public $show_view_mode = 0;
public function __construct($config = array())
{
parent::__construct($config);
$request = WFRequest::getInstance();
$layout = JRequest::getCmd('layout', 'plugin');
if ($layout === 'plugin') {
$this->addFileBrowserEvent('onBeforeUpload', array($this, 'onBeforeUpload'));
$this->addFileBrowserEvent('onUpload', array($this, 'onUpload'));
if (JRequest::getCmd('action') === 'thumbnail') {
WFToken::checkToken() or die('RESTRICTED');
$file = JRequest::getVar('img', '', 'GET', 'PATH');
// check file path
WFUtility::checkPath($file);
if ($file && preg_match('/\.(jpg|jpeg|png|gif|tiff|bmp)$/i', $file)) {
return $this->createCacheThumb(rawurldecode($file));
}
}
}
else {
$request->setRequest(array($this, 'applyEdit'));
}
$request->setRequest(array($this, 'saveEdit'));
$request->setRequest(array($this, 'cleanEditorTmp'));
}
/**
* Display the plugin.
*/
public function display()
{
$document = WFDocument::getInstance();
$layout = JRequest::getCmd('layout', 'plugin');
// Plugin
if ($layout === 'plugin') {
if ($this->get('can_edit_images')) {
$request = WFRequest::getInstance();
if ($this->getParam('editor.image_editor', 1)) {
$this->addFileBrowserButton('file', 'image_editor', array('action' => 'editImage', 'title' => WFText::_('WF_BUTTON_EDIT_IMAGE'), 'restrict' => 'jpg,jpeg,png,gif'));
}
}
// get parent display data
parent::display();
// add pro scripts
$document->addScript(array('widget'), 'pro');
$document->addStyleSheet(array('manager'), 'pro');
}
// Image Editor
if ($layout === 'editor') {
if ($this->getParam('editor.image_editor', 1) == 0) {
JError::raiseError(403, WFText::_('RESTRICTED'));
}
// cleanup tmp files
$this->cleanEditorTmp();
$view = $this->getView();
$view->setLayout('editor');
$view->addTemplatePath(WF_EDITOR_LIBRARIES . '/pro/views/editor/tmpl');
$lists = array();
$lists['resize'] = $this->getPresetsList('resize');
$lists['crop'] = $this->getPresetsList('crop');
$view->assign('lists', $lists);
// get parent display data
parent::display();
// get UI Theme
$theme = $this->getParam('editor.dialog_theme', 'jce');
$document->addScript(array('webgl', 'filter', 'canvas', 'transform', 'editor'), 'pro');
$document->addStyleSheet(array('editor.css'), 'pro');
$document->addScriptDeclaration('jQuery(document).ready(function($){EditorDialog.init({"site" : "' . JURI::root() . '", "root" : "' . JURI::root(true) . '"})});');
$document->setTitle(WFText::_('WF_MANAGER_IMAGE_EDITOR'));
}
}
public function getPresetsList($type)
{
$list = array();
switch ($type) {
case 'resize' :
$list = explode(',', $this->getParam('editor.resize_presets', '320x240,640x480,800x600,1024x768', '', 'string', false));
break;
case 'crop' :
$list = explode(',', $this->getParam('editor.crop_presets', '4:3,16:9,20:30,320x240,240x320,640x480,480x640,800x600,1024x768', '', 'string', false));
break;
}
return $list;
}
private function isFtp()
{
// Initialize variables
jimport('joomla.client.helper');
$FTPOptions = JClientHelper::getCredentials('ftp');
return $FTPOptions['enabled'] == 1;
}
protected function getImageEditor()
{
static $editor;
if (!is_object($editor)) {
$editor = new WFImageEditor(array(
'ftp' => $this->isFtp(),
'edit' => $this->get('can_edit_images'),
'prefer_imagick' => (bool)$this->getParam('editor.prefer_imagick', true),
'remove_exif' => (bool)$this->getParam('editor.upload_remove_exif', false),
'resample_image' => (bool)$this->getParam('editor.resample_image', true),
));
}
return $editor;
}
private static function convertIniValue($value)
{
$suffix = '';
preg_match('#([0-9]+)\s?([a-z]+)#i', $value, $matches);
// get unit
if (isset($matches[2])) {
$suffix = $matches[2];
}
// get value
if (isset($matches[1])) {
$value = (int)$matches[1];
}
// Convert to bytes
switch (strtolower($suffix)) {
case 'g' :
case 'gb' :
$value *= 1073741824;
break;
case 'm' :
case 'mb' :
$value *= 1048576;
break;
case 'k' :
case 'kb' :
$value *= 1024;
break;
}
return (int)$value;
}
private static function checkMem($image)
{
$channels = ($image['mime'] == 'image/png') ? 4 : 3;
if (function_exists('memory_get_usage')) {
// try ini_get
$limit = ini_get('memory_limit');
// try get_cfg_var
if (empty($limit)) {
$limit = get_cfg_var('memory_limit');
}
// can't get from ini, assume low value of 32M
if (empty($limit)) {
$limit = 32 * 1048576;
}
else {
$limit = self::convertIniValue($limit);
}
// get memory used so far
$used = memory_get_usage(true);
return $image[0] * $image[1] * $channels * 1.7 < $limit - $used;
}
return true;
}
public function onBeforeUpload(&$file, &$dir, &$name)
{
$remove_exif = $this->getParam('editor.remove_exif', 0);
// remove exif data
if ($remove_exif && preg_match('#\.(jpg|jpeg|png)$#i', $file['name'])) {
if ($this->removeExifData($file['tmp_name']) === false) {
@unlink($file['tmp_name']);
throw new InvalidArgumentException(WFText::_('WF_MANAGER_UPLOAD_EXIF_REMOVE_ERROR'));
return false;
}
}
}
public function onUpload($file, $relative = '')
{
$browser = $this->getFileBrowser();
$editor = $this->getImageEditor();
// default values from parameters
$resize = (int)$this->getParam('editor.upload_resize_state', 0);
$resize_width = $this->getParam('editor.resize_width', '640');
$resize_height = $this->getParam('editor.resize_height', '480');
if (!is_array($resize_width)) {
$resize_width = explode(',', (string)$resize_width);
}
if (!is_array($resize_height)) {
$resize_height = explode(',', (string)$resize_height);
}
jimport('joomla.input.filter');
// dialog/form upload
if (JRequest::getInt('inline', 0) === 0) {
$file_resize = false;
// Resize options visible
if ((bool)$this->getParam('editor.upload_resize', 1)) {
$resize = JRequest::getInt('upload_resize_state', 0);
foreach (array('resize_width', 'resize_height', 'file_resize_width', 'file_resize_height') as $var) {
$ $var = JRequest::getVar('upload_' . $var, '');
// pass each value through intval
$ $var = array_map(intval, $ $var);
}
$resize_suffix = JRequest::getVar('upload_resize_suffix', '');
// check for individual resize values
foreach (array_merge($file_resize_width, $file_resize_height) as $item) {
// at least one value set, so resize
if (!empty($item)) {
$file_resize = true;
break;
}
}
// transfer values
if ($file_resize) {
$resize_width = $file_resize_width;
$resize_height = $file_resize_height;
$file_resize_suffix = JRequest::getVar('upload_file_resize_suffix', '');
for ($i = 1; $i < count($file_resize_suffix); $i++) {
$resize_suffix[i] = $file_resize_suffix[$i];
}
// set global resize option
$resize = true;
}
}
}
// should exif data be removed?
$removeExif = (int)$this->getParam('editor.upload_remove_exif', 0) && preg_match('#\.(jpg|jpeg|png)$#i', $file);
$dim = getimagesize($file);
if ($dim) {
$width = $dim[0];
$height = $dim[1];
$files = array($file);
if ($resize) {
$resize_quality = (int)$this->getParam('editor.resize_quality', 100);
$count = max(count($resize_width), count($resize_height));
for ($i = 0; $i < $count; ++$i) {
// need at least one value
if (!empty($resize_width[$i]) || !empty($resize_height[$i])) {
// calculate width if not set
if (empty($resize_width[$i])) {
$resize_width[$i] = round($resize_height[$i] / $height * $width, 0);
}
// calculate height if not set
if (empty($resize_height[$i])) {
$resize_height[$i] = round($resize_width[$i] / $width * $height, 0);
}
// get scale based on aspect ratio
$scale = ($width > $height) ? $resize_width[$i] / $width : $resize_height[$i] / $height;
if ($scale < 1) {
$destination = '';
$path = dirname($file);
$name = pathinfo($file, PATHINFO_FILENAME);
$ext = pathinfo($file, PATHINFO_EXTENSION);
$suffix = '';
// create suffix based on width/height values for images after first
if (empty($resize_suffix[$i]) && $i > 0) {
$suffix = '_' . $resize_width[$i] . '_' . $resize_height[$i];
}
else {
// replace width and height variables
$suffix = str_replace(array('$width', '$height'), array($resize_width[$i], $resize_height[$i]), $resize_suffix[$i]);
}
$name .= $suffix . '.' . $ext;
// validate name
WFUtility::checkPath($name);
// create new destination
$destination = WFUtility::makePath($path, $name);
// no need to remove exif data on successful resize
if ($editor->resize($file, $destination, $resize_width[$i], $resize_height[$i], $resize_quality)) {
$removeExif = false;
if ($file !== $destination) {
$files[] = $destination;
}
}
else {
$browser->setResult(WFText::_('WF_MANAGER_RESIZE_ERROR'), 'error');
}
}
}
}
}
// default parameter option
$watermark = $this->getParam('editor.upload_watermark_state', 0);
// option visible so allow user set value
if ((bool)$this->getParam('editor.upload_watermark', 0)) {
$watermark = JRequest::getInt('upload_watermark_state', 0);
}
if ($watermark) {
$font_style = $this->getParam('watermark_font_style', 'LiberationSans-Regular.ttf');
// default LiberationSans fonts
if (preg_match('#^LiberationSans-(Regular|Bold|BoldItalic|Italic)\.ttf$#', $font_style)) {
$font_style = WF_EDITOR_LIBRARIES . '/pro/fonts/' . $font_style;
// custom font
}
else {
$font_style = JPATH_SITE . '/' . trim(preg_replace('#[\/\\\\]+#', '/', $font_style), '/');
}
$options = array(
'type' => $this->getParam('editor.watermark_type', 'text'),
'text' => $this->getParam('editor.watermark_text', ''),
'image' => $this->getParam('editor.watermark_image', ''),
'font_style' => str_replace(JPATH_SITE, '', $font_style),
'font_size' => $this->getParam('editor.watermark_font_size', '32'),
'font_color' => $this->getParam('editor.watermark_font_color', '#FFFFFF'),
'opacity' => $this->getParam('editor.watermark_opacity', 50),
'position' => $this->getParam('editor.watermark_position', 'center'),
'margin' => $this->getParam('editor.watermark_margin', 10),
'angle' => $this->getParam('editor.watermark_angle', 0),
);
foreach ($files as $file) {
// no need to remove exif on successful watermark
if ($editor->watermark($file, $options)) {
$removeExif = false;
}
else {
$browser->setResult(WFText::_('WF_MANAGER_WATERMARK_ERROR'), 'error');
}
}
}
$thumbnail = $this->getParam('upload_thumbnail_state', 0);
$tw = (int)$this->getParam('thumbnail_width', 120);
$th = (int)$this->getParam('thumbnail_height', 90);
$crop = $this->getParam('upload_thumbnail_crop', 0);
// Thumbnail options visible
if ((bool)$this->getParam('upload_thumbnail', 1)) {
$thumbnail = JRequest::getInt('upload_thumbnail_state', 0);
$tw = (int)JRequest::getInt('upload_thumbnail_width');
$th = (int)JRequest::getInt('upload_thumbnail_height');
// Crop Thumbnail
$crop = JRequest::getInt('upload_thumbnail_crop', 0);
}
if ($thumbnail) {
$dim = @getimagesize($file);
$tq = $this->getParam('upload_thumbnail_quality', 80, false);
// need at least one value
if ($tw || $th) {
// calculate width if not set
if (!$tw) {
$tw = round($th / $dim[1] * $dim[0], 0);
}
// calculate height if not set
if (!$th) {
$th = round($tw / $dim[0] * $dim[1], 0);
}
// Make relative
$source = str_replace($browser->getBaseDir(), '', $file);
$coords = array(
'sx' => null,
'sy' => null,
'sw' => null,
'sh' => null,
);
if ($crop) {
$coords = $this->cropThumbnail($dim[0], $dim[1], $tw, $th);
}
if (!$this->createThumbnail($source, $tw, $th, $tq, $coords['sx'], $coords['sy'], $coords['sw'], $coords['sh'], true)) {
$browser->setResult(WFText::_('WF_IMGMANAGER_EXT_THUMBNAIL_ERROR'), 'error');
}
}
}
if ($removeExif) {
// remove exif data
if ($this->removeExifData($file) === false) {
@unlink($file);
$browser->setResult(WFText::_('WF_MANAGER_UPLOAD_EXIF_REMOVE_ERROR'), 'error');
}
}
}
return $browser->getResult();
}
private function toRelative($file)
{
return WFUtility::makePath(str_replace(JPATH_ROOT . '/', '', dirname(JPath::clean($file))), basename($file));
}
public function cleanEditorTmp($file = null, $exit = true)
{
// Check for request forgeries
WFToken::checkToken() or die('Access to this resource is restricted');
// check for image editor access
if ($this->checkAccess('image_editor', 1) === false) {
JError::raiseError(403, 'Access to this resource is restricted');
}
if ($file) {
$ext = WFUtility::getExtension($file);
// create temp file
$tmp = 'wf_ie_' . md5($file) . '.' . $ext;
$path = WFUtility::makePath($this->getCacheDirectory(), $tmp);
self::validateImagePath($file);
$result = false;
if (is_file($path)) {
$result = @JFile::delete($path);
}
if ($exit) {
return (bool)$result;
}
}
else {
$files = JFolder::files($this->getCacheDirectory(), '^(wf_ie_)([a-z0-9]+)\.(jpg|jpeg|gif|png)$');
if (count($files)) {
$time = strtotime('24 hours ago');
clearstatcache();
foreach ($files as $file) {
// delete files older than 24 hours
if (@filemtime($file) >= $time) {
@JFile::delete($file);
}
}
}
}
return true;
}
public function applyEdit($file, $task, $value)
{
// Check for request forgeries
WFToken::checkToken() or die('Access to this resource is restricted');
// check for image editor access
if ($this->checkAccess('image_editor', 1) === false) {
JError::raiseError(403, 'Access to this resource is restricted');
}
$browser = $this->getFileBrowser();
// check file
self::validateImagePath($file);
$upload = JRequest::getVar('file', '', 'files', 'array');
// create a filesystem result object
$result = new WFFileSystemResult();
if (isset($upload) && isset($upload['tmp_name']) && is_uploaded_file($upload['tmp_name'])) {
self::validateImageFile($upload);
$ext = WFUtility::getExtension($file);
// create temp file
$tmp = 'wf_ie_' . md5($file) . '.' . $ext;
$tmp = WFUtility::makePath($this->getCacheDirectory(), $tmp);
// delete existing tmp file
if (is_file($tmp)) {
@JFile::delete($tmp);
}
// load image class
require_once __DIR__ . '/image/image.php';
// create image
$image = new WFImage($upload['tmp_name'], array('preferImagick' => $this->getParam('editor.prefer_imagick', true)));
switch ($task) {
case 'resize' :
$image->resize($value->width, $value->height);
break;
case 'crop' :
$image->crop($value->width, $value->height, $value->x, $value->y, false, 1);
break;
}
// get image data
$data = $image->toString($ext);
// write to file
if ($data) {
$result->state = (bool)@JFile::write($tmp, $data);
}
if ($result->state === true) {
$tmp = str_replace(WFUtility::cleanPath(JPATH_SITE), '', $tmp);
$browser->setResult(WFUtility::cleanPath($tmp, '/'), 'files');
}
else {
$browser->setResult(WFText::_('WF_IMAGE_EDIT_APPLY_ERROR'), 'error');
}
@unlink($upload['tmp_name']);
return $browser->getResult();
}
}
public function saveEdit($file, $name, $options = array(), $quality = 100)
{
// Check for request forgeries
WFToken::checkToken() or die('Access to this resource is restricted');
// check for image editor access
if ($this->checkAccess('image_editor', 1) === false) {
JError::raiseError(403, 'Access to this resource is restricted');
}
$browser = $this->getFileBrowser();
$filesystem = $browser->getFileSystem();
// check file
self::validateImagePath($file);
// clean temp
$this->cleanEditorTmp($file, false);
// check new name
self::validateImagePath($name);
$upload = JRequest::getVar('file', '', 'files', 'array');
// create a filesystem result object
$result = new WFFileSystemResult();
if (isset($upload) && isset($upload['tmp_name']) && is_uploaded_file($upload['tmp_name'])) {
$tmp = $upload['tmp_name'];
self::validateImageFile($upload);
$result = $filesystem->upload('multipart', trim($tmp), dirname($file), basename($name));
@unlink($tmp);
}
else {
// set upload as false - JSON request
$upload = false;
$file = WFUtility::makePath($filesystem->getBaseDir(), $file);
$dest = dirname($file) . '/' . basename($name);
// get extension
$ext = WFUtility::getExtension($dest);
// load image class
require_once __DIR__ . '/image/image.php';
// create image
$image = new WFImage($file, array(
'preferImagick' => $this->getParam('editor.prefer_imagick', true),
'resampleImage' => $this->getParam('editor.resample_image', true),
));
foreach ($options as $filter) {
if (isset($filter->task)) {
$args = isset($filter->args) ? (array)$filter->args : array();
switch ($filter->task) {
case 'resize' :
$w = $args[0];
$h = $args[1];
$image->resize($w, $h);
break;
case 'crop' :
$w = $args[0];
$h = $args[1];
$x = $args[2];
$y = $args[3];
$image->crop($w, $h, $x, $y);
break;
case 'rotate' :
$image->rotate(array_shift($args));
break;
case 'flip' :
$image->flip(array_shift($args));
break;
default :
$image->filter($filter->task, $args);
break;
}
}
}
// get image data
$data = $image->toString($ext);
// write to file
if ($data) {
$result->state = (bool)@JFile::write($dest, $data);
}
// set path
$result->path = $dest;
}
if ($result->state === true) {
// check if its a valid image
if (@getimagesize($result->path) === false) {
JFile::delete($result->path);
throw new InvalidArgumentException('Invalid image file');
}
else {
$result->path = str_replace(WFUtility::cleanPath(JPATH_SITE), '', $result->path);
$browser->setResult(WFUtility::cleanPath($result->path, '/'), 'files');
}
}
else {
$browser->setResult($result->message || WFText::_('WF_MANAGER_EDIT_SAVE_ERROR'), 'error');
}
// return to WFRequest
return $browser->getResult();
}
protected function cropThumbnail($sw, $sh, $dw, $dh)
{
$sx = 0;
$sy = 0;
$w = $dw;
$h = $dh;
if ($w / $h > $sw / $w) {
$h = $h * ($sw / $w);
$w = $sw;
if ($h > $sh) {
$w = $w * ($sh / $h);
$h = $sh;
}
}
else {
$w = $w * ($sh / $h);
$h = $sh;
if ($w > $sw) {
$h = $h * ($sw / $w);
$w = $sw;
}
}
if ($w < $sw) {
$sx = floor( ($sw - $w) / 2);
}
else {
$sx = 0;
}
if ($h < $sh) {
$sy = floor( ($sh - $h) / 2);
}
else {
$sy = 0;
}
return array('sx' => $sx, 'sy' => $sy, 'sw' => $w, 'sh' => $h);
}
private function getCacheDirectory()
{
$app = JFactory::getApplication();
jimport('joomla.filesystem.folder');
$cache = $app->getCfg('tmp_path');
$dir = $this->getParam('editor.cache', $cache);
// make sure a value is set
if (empty($dir)) {
$dir = 'tmp';
}
// check for and create absolute path
if (strpos($dir, JPATH_SITE) === false) {
$dir = WFUtility::makePath(JPATH_SITE, JPath::clean($dir));
}
if (!JFolder::exists($dir)) {
if (@JFolder::create($dir)) {
return $dir;
}
}
return $dir;
}
private function cleanCacheDir()
{
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
$cache_max_size = intval($this->getParam('editor.cache_size', 10, false)) * 1024 * 1024;
$cache_max_age = intval($this->getParam('editor.cache_age', 30, false)) * 86400;
$cache_max_files = intval($this->getParam('editor.cache_files', 0, false));
if ($cache_max_age > 0 || $cache_max_size > 0 || $cache_max_files > 0) {
$path = $this->getCacheDirectory();
$files = JFolder::files($path, '^(wf_thumb_cache_)([a-z0-9]+)\.(jpg|jpeg|gif|png)$');
$num = count($files);
$size = 0;
$cutofftime = time() - 3600;
if ($num) {
foreach ($files as $file) {
$file = WFUtility::makePath($path, $file);
if (is_file($file)) {
$ftime = @fileatime($file);
$fsize = @filesize($file);
if ($fsize == 0 && $ftime < $cutofftime) {
@JFile::delete($file);
}
if ($cache_max_files > 0) {
if ($num > $cache_max_files) {
@JFile::delete($file);
--$num;
}
}
if ($cache_max_age > 0) {
if ($ftime < (time() - $cache_max_age)) {
@JFile::delete($file);
}
}
if ($cache_max_files > 0) {
if ( ($size + $fsize) > $cache_max_size) {
@JFile::delete($file);
}
}
}
}
}
}
return true;
}
private function redirectThumb($file, $mime)
{
if (is_file($file)) {
header('Content-length: ' . filesize($file));
header('Content-type: ' . $mime);
header('Location: ' . $this->toRelative($file));
}
}
private function outputImage($file, $mime)
{
if (is_file($file)) {
header('Content-length: ' . filesize($file));
header('Content-type: ' . $mime);
ob_clean();
flush();
@readfile($file);
}
exit();
}
private function getCacheThumbPath($file, $width, $height)
{
jimport('joomla.filesystem.file');
$mtime = @filemtime($file);
$thumb = 'wf_thumb_cache_' . md5(basename(JFile::stripExt($file)) . $mtime . $width . $height) . '.' . JFile::getExt($file);
return WFUtility::makePath($this->getCacheDirectory(), $thumb);
}
private function createCacheThumb($file)
{
jimport('joomla.filesystem.file');
$browser = $this->getFileBrowser();
$editor = $this->getImageEditor();
// check path
WFUtility::checkPath($file);
$file = WFUtility::makePath($browser->getBaseDir(), $file);
// default for list thumbnails
$width = 100;
$height = 100;
$quality = 75;
$data = @getimagesize($file);
$mime = $data['mime'];
if ( ($data[0] < $width && $data[1] < $height)) {
return $this->outputImage($file, $mime);
}
// try exif thumbnail
if ($mime == 'image/jpeg' || $mime == 'image/tiff') {
$exif = exif_thumbnail($file, $width, $height, $type);
if ($exif !== false) {
header('Content-type: ' . image_type_to_mime_type($type));
die($exif);
}
}
$thumb = $this->getCacheThumbPath($file, $width, $height);
if (JFile::exists($thumb)) {
return $this->outputImage($thumb, $mime);
}
$coords = $this->cropThumbnail($data[0], $data[1], $width, $height);
if (self::checkMem($data)) {
if ($editor->resize($file, $thumb, $width, $height, $quality, $coords['sx'], $coords['sy'], $coords['sw'], $coords['sh'])) {
if (JFile::exists($thumb)) {
return $this->outputImage($thumb, $mime);
}
}
}
// exit with no data
exit();
}
public function getThumbnails($files)
{
$browser = $this->getFileBrowser();
jimport('joomla.filesystem.file');
$thumbnails = array();
foreach ($files as $file) {
$thumbnails[$file['name']] = $this->getCacheThumb(WFUtility::makePath($browser->getBaseDir(), $file['url']), true, 50, 50, JFile::getExt($file['name']), 50);
}
return $thumbnails;
}
protected static function validateImageFile($file)
{
return WFUtility::isSafeFile($file);
}
/**
* Validate an image path and extension.
*
* @param type $path Image path
*
* @throws InvalidArgumentException
*/
protected static function validateImagePath($path)
{
// nothing to validate
if (empty($path)) {
return false;
}
// check file path
WFUtility::checkPath($path);
// check file name and contents
WFUtility::validateFileName($path);
}
/**
* Remove exif data from an image by rewriting it. This will also rotate images to correct orientation.
*
* @param $image
*
* @return bool
*/
private function removeExifData($image)
{
$exif = null;
// check if exif_read_data disabled...
if (function_exists('exif_read_data')) {
// get exif data
$exif = exif_read_data($image);
$rotate = 0;
if (!empty($exif['Orientation'])) {
$orientation = (int)$exif['Orientation'];
// Fix Orientation
switch ($orientation) {
case 3 :
$rotate = 180;
break;
case 6 :
$rotate = 90;
break;
case 8 :
$rotate = 270;
break;
}
}
}
if (extension_loaded('imagick')) {
try {
$img = new Imagick($image);
if ($rotate) {
$img->rotateImage(new ImagickPixel(), $rotate);
}
// get iptcc
//$iptcc = $img->getImageProfile('iptcc');
$img->stripImage();
// add back iptcc
/*if (!empty($iptcc)) {
$img->profileImage($iptcc);
}*/
$img->writeImage($image);
$img->clear();
$img->destroy();
return true;
} catch (Exception $e) {
}
}
elseif (extension_loaded('gd')) {
try {
$info = getimagesize($image);
if (!empty($info)) {
if ($info[2] === IMAGETYPE_JPEG) {
$handle = imagecreatefromjpeg($image);
if (is_resource($handle)) {
if ($rotate) {
$handle = imagerotate($handle, $rotate, -1);
}
imagejpeg($handle, $image);
@imagedestroy($handle);
return true;
}
}
if ($info[2] === IMAGETYPE_PNG) {
$handle = imagecreatefrompng($image);
if (is_resource($handle)) {
if ($rotate) {
$handle = imagerotate($handle, $rotate, -1);
}
// Allow transparency for the new image handle.
imagealphablending($handle, false);
imagesavealpha($handle, true);
imagepng($handle, $image);
@imagedestroy($handle);
return true;
}
}
}
} catch (Exception $e) {
}
}
return false;
}
/**
* Get an image's thumbnail file name.
*
* @param string $file the full path to the image file
*
* @return string of the thumbnail file
*/
protected function getThumbName($file)
{
$ext = WFUtility::getExtension($file);
$string = $this->getParam($this->getName() . '.thumbnail_prefix', $this->getParam('editor.thumbnail_prefix', 'thumb_$'));
if (strpos($string, '$') !== false) {
return str_replace('$', basename($file, '.' . $ext), $string) . '.' . $ext;
}
return $string . basename($file);
}
protected function getThumbDir($file, $create)
{
$browser = $this->getFileBrowser();
$filesystem = $browser->getFileSystem();
$folder = $this->getParam($this->getName() . '.thumbnail_folder', $this->getParam('editor.thumbnail_folder', 'thumbnails'));
$dir = WFUtility::makePath(dirname($file), $folder);
if ($create && !$filesystem->exists($dir)) {
$filesystem->createFolder(dirname($dir), basename($dir));
}
return $dir;
}
/**
* Create a thumbnail.
*
* @param string $file relative path of the image
* @param string $width thumbnail width
* @param string $height thumbnail height
* @param string $quality thumbnail quality (%)
* @param string $mode thumbnail mode
*/
public function createThumbnail($file, $width = null, $height = null, $quality = 100, $sx = null, $sy = null, $sw = null, $sh = null)
{
// check path
self::validateImagePath($file);
$browser = $this->getFileBrowser();
$editor = $this->getImageEditor();
$thumb = WFUtility::makePath($this->getThumbDir($file, true), $this->getThumbName($file));
$path = WFUtility::makePath($browser->getBaseDir(), $file);
$thumb = WFUtility::makePath($browser->getBaseDir(), $thumb);
if (!$editor->resize($path, $thumb, $width, $height, $quality, $sx, $sy, $sw, $sh)) {
$browser->setResult(WFText::_('WF_IMGMANAGER_EXT_THUMBNAIL_ERROR'), 'error');
}
return $browser->getResult();
}
protected function getFileBrowserConfig($config = array())
{
$data = array(
'view_mode' => $this->getParam('editor.mode', 'list'),
'can_edit_images' => $this->get('can_edit_images'),
'cache_enable' => $this->getParam('editor.cache_enable', 0),
// Upload
'upload_resize' => $this->getParam('editor.upload_resize', 1),
'upload_resize_state' => $this->getParam('editor.upload_resize_state', 0),
'upload_resize_width' => (string)$this->getParam('editor.resize_width', '640'),
'upload_resize_height' => (string)$this->getParam('editor.resize_height', '480'),
'upload_resize_quality' => $this->getParam('editor.resize_quality', 100),
'upload_watermark' => $this->getParam('editor.upload_watermark', 0),
'upload_watermark_state' => $this->getParam('editor.upload_watermark_state', 0),
'upload_thumbnail' => $this->getParam('upload_thumbnail', 1),
'upload_thumbnail_state' => $this->getParam('upload_thumbnail_state', 0),
'upload_thumbnail_crop' => $this->getParam('upload_thumbnail_crop', 0),
'upload_thumbnail_width' => $this->getParam('upload_thumbnail_width', 120),
'upload_thumbnail_height' => $this->getParam('upload_thumbnail_height', 90),
'upload_thumbnail_quality' => $this->getParam('upload_thumbnail_quality', 80)
);
$config = WFUtility::array_merge_recursive_distinct($data, $config);
return parent::getFileBrowserConfig($config);
}
}