aboutsummaryrefslogtreecommitdiffstats
path: root/BSF/admin/thumbnail.php
diff options
context:
space:
mode:
Diffstat (limited to 'BSF/admin/thumbnail.php')
-rw-r--r--BSF/admin/thumbnail.php352
1 files changed, 352 insertions, 0 deletions
diff --git a/BSF/admin/thumbnail.php b/BSF/admin/thumbnail.php
new file mode 100644
index 000000000..57ecf9cdb
--- /dev/null
+++ b/BSF/admin/thumbnail.php
@@ -0,0 +1,352 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify |
+// | it under the terms of the GNU General Public License as published by |
+// | the Free Software Foundation |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+//------------------------------------------------------------------- functions
+// RatioResizeImg creates a new picture (a thumbnail since it is supposed to
+// be smaller than original picture !) in the sub directory named
+// "thumbnail".
+function RatioResizeImg($path, $newWidth, $newHeight, $tn_ext)
+{
+ global $conf, $lang, $page;
+
+ if (!function_exists('gd_info'))
+ {
+ return;
+ }
+
+ $filename = basename($path);
+ $dirname = dirname($path);
+
+ // extension of the picture filename
+ $extension = get_extension($filename);
+
+ if (in_array($extension, array('jpg', 'JPG', 'jpeg', 'JPEG')))
+ {
+ $srcImage = @imagecreatefromjpeg($path);
+ }
+ else if ($extension == 'png' or $extension == 'PNG')
+ {
+ $srcImage = @imagecreatefrompng($path);
+ }
+ else
+ {
+ unset($extension);
+ }
+
+ if ( isset( $srcImage ) )
+ {
+ // width/height
+ $srcWidth = imagesx( $srcImage );
+ $srcHeight = imagesy( $srcImage );
+ $ratioWidth = $srcWidth/$newWidth;
+ $ratioHeight = $srcHeight/$newHeight;
+
+ // maximal size exceeded ?
+ if ( ( $ratioWidth > 1 ) or ( $ratioHeight > 1 ) )
+ {
+ if ( $ratioWidth < $ratioHeight)
+ {
+ $destWidth = $srcWidth/$ratioHeight;
+ $destHeight = $newHeight;
+ }
+ else
+ {
+ $destWidth = $newWidth;
+ $destHeight = $srcHeight/$ratioWidth;
+ }
+ }
+ else
+ {
+ $destWidth = $srcWidth;
+ $destHeight = $srcHeight;
+ }
+ // according to the GD version installed on the server
+ if ( $_POST['gd'] == 2 )
+ {
+ // GD 2.0 or more recent -> good results (but slower)
+ $destImage = imagecreatetruecolor( $destWidth, $destHeight);
+ imagecopyresampled( $destImage, $srcImage, 0, 0, 0, 0,
+ $destWidth,$destHeight,$srcWidth,$srcHeight );
+ }
+ else
+ {
+ // GD prior to version 2 -> pretty bad results :-/ (but fast)
+ $destImage = imagecreate( $destWidth, $destHeight);
+ imagecopyresized( $destImage, $srcImage, 0, 0, 0, 0,
+ $destWidth,$destHeight,$srcWidth,$srcHeight );
+ }
+
+ if (($tndir = mkget_thumbnail_dir($dirname, $page['errors'])) == false)
+ {
+ return false;
+ }
+
+ $dest_file = $tndir.'/'.$conf['prefix_thumbnail'];
+ $dest_file.= get_filename_wo_extension($filename);
+ $dest_file.= '.'.$tn_ext;
+
+ // creation and backup of final picture
+ if (!is_writable($tndir))
+ {
+ array_push($page['errors'], '['.$tndir.'] : '.l10n('no_write_access'));
+ return false;
+ }
+ imagejpeg($destImage, $dest_file);
+ // freeing memory ressources
+ imagedestroy( $srcImage );
+ imagedestroy( $destImage );
+
+ list($tn_width, $tn_height) = getimagesize($dest_file);
+ $tn_size = floor(filesize($dest_file) / 1024).' KB';
+
+ $info = array( 'path' => $path,
+ 'tn_file' => $dest_file,
+ 'tn_width' => $tn_width,
+ 'tn_height' => $tn_height,
+ 'tn_size' => $tn_size );
+ return $info;
+ }
+ // error
+ else
+ {
+ echo l10n('tn_no_support')." ";
+ if ( isset( $extenstion ) )
+ {
+ echo l10n('tn_format').' '.$extension;
+ }
+ else
+ {
+ echo l10n('tn_thisformat');
+ }
+ exit();
+ }
+}
+
+$pictures = array();
+$stats = array();
+// +-----------------------------------------------------------------------+
+// | template initialization |
+// +-----------------------------------------------------------------------+
+$template->set_filenames( array('thumbnail'=>'admin/thumbnail.tpl') );
+
+$template->assign(array(
+ 'U_HELP' => PHPWG_ROOT_PATH.'popuphelp.php?page=thumbnail',
+ ));
+// +-----------------------------------------------------------------------+
+// | search pictures without thumbnails |
+// +-----------------------------------------------------------------------+
+$wo_thumbnails = array();
+$thumbnalized = array();
+
+
+// what is the directory to search in ?
+$query = '
+SELECT galleries_url FROM '.SITES_TABLE.'
+ WHERE galleries_url NOT LIKE "http://%"
+;';
+$result = pwg_query($query);
+while ( $row=mysql_fetch_assoc($result) )
+{
+ $basedir = preg_replace('#/*$#', '', $row['galleries_url']);
+ $fs = get_fs($basedir);
+
+ // because isset is one hundred time faster than in_array
+ $fs['thumbnails'] = array_flip($fs['thumbnails']);
+
+ foreach ($fs['elements'] as $path)
+ {
+ // only pictures need thumbnails
+ if (in_array(get_extension($path), $conf['picture_ext']))
+ {
+ $dirname = dirname($path);
+ $filename = basename($path);
+
+ // only files matching the authorized filename pattern can be considered
+ // as "without thumbnail"
+ if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $filename))
+ {
+ continue;
+ }
+
+ // searching the element
+ $filename_wo_ext = get_filename_wo_extension($filename);
+ $tn_ext = '';
+ $base_test = $dirname.'/thumbnail/';
+ $base_test.= $conf['prefix_thumbnail'].$filename_wo_ext.'.';
+ foreach ($conf['picture_ext'] as $ext)
+ {
+ if (isset($fs['thumbnails'][$base_test.$ext]))
+ {
+ $tn_ext = $ext;
+ break;
+ }
+ }
+
+ if (empty($tn_ext))
+ {
+ array_push($wo_thumbnails, $path);
+ }
+ }
+ } // next element
+} // next site id
+// +-----------------------------------------------------------------------+
+// | thumbnails creation |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit']))
+{
+ $times = array();
+ $infos = array();
+
+ // checking criteria
+ if (!ereg('^[0-9]{2,3}$', $_POST['width']) or $_POST['width'] < 10)
+ {
+ array_push($page['errors'], l10n('tn_err_width').' 10');
+ }
+ if (!ereg('^[0-9]{2,3}$', $_POST['height']) or $_POST['height'] < 10)
+ {
+ array_push($page['errors'], l10n('tn_err_height').' 10');
+ }
+
+ // picture miniaturization
+ if (count($page['errors']) == 0)
+ {
+ $num = 1;
+ foreach ($wo_thumbnails as $path)
+ {
+ if (is_numeric($_POST['n']) and $num > $_POST['n'])
+ {
+ break;
+ }
+
+ $starttime = get_moment();
+ if ($info = RatioResizeImg($path,$_POST['width'],$_POST['height'],'jpg'))
+ {
+ $endtime = get_moment();
+ $info['time'] = ($endtime - $starttime) * 1000;
+ array_push($infos, $info);
+ array_push($times, $info['time']);
+ array_push($thumbnalized, $path);
+ $num++;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if (count($infos) > 0)
+ {
+ $sum = array_sum($times);
+ $average = $sum / count($times);
+ sort($times, SORT_NUMERIC);
+ $max = array_pop($times);
+ if (count($thumbnalized) == 1)
+ {
+ $min = $max;
+ }
+ else
+ {
+ $min = array_shift($times);
+ }
+
+ $tpl_var =
+ array(
+ 'TN_NB'=>count($infos),
+ 'TN_TOTAL'=>number_format($sum, 2, '.', ' ').' ms',
+ 'TN_MAX'=>number_format($max, 2, '.', ' ').' ms',
+ 'TN_MIN'=>number_format($min, 2, '.', ' ').' ms',
+ 'TN_AVERAGE'=>number_format($average, 2, '.', ' ').' ms',
+ 'elements' => array()
+ );
+
+ foreach ($infos as $i => $info)
+ {
+ $tpl_var['elements'][] =
+ array(
+ 'PATH'=>$info['path'],
+ 'TN_FILE_IMG'=>$info['tn_file'],
+ 'TN_FILESIZE_IMG'=>$info['tn_size'],
+ 'TN_WIDTH_IMG'=>$info['tn_width'],
+ 'TN_HEIGHT_IMG'=>$info['tn_height'],
+ 'GEN_TIME'=>number_format($info['time'], 2, '.', ' ').' ms',
+ );
+ }
+ $template->assign('results', $tpl_var);
+ }
+ }
+}
+// +-----------------------------------------------------------------------+
+// | form & pictures without thumbnails display |
+// +-----------------------------------------------------------------------+
+$remainings = array_diff($wo_thumbnails, $thumbnalized);
+
+if (count($remainings) > 0)
+{
+ $form_url = get_root_url().'admin.php?page=thumbnail';
+ $gd = !empty($_POST['gd']) ? $_POST['gd'] : 2;
+ $width = !empty($_POST['width']) ? $_POST['width'] : $conf['tn_width'];
+ $height = !empty($_POST['height']) ? $_POST['height'] : $conf['tn_height'];
+ $n = !empty($_POST['n']) ? $_POST['n'] : 5;
+
+ $template->assign(
+ 'params',
+ array(
+ 'F_ACTION'=> $form_url,
+ 'GD_SELECTED' => $gd,
+ 'N_SELECTED' => $n,
+ 'WIDTH_TN'=>$width,
+ 'HEIGHT_TN'=>$height
+ ));
+
+ $template->assign(
+ 'TOTAL_NB_REMAINING',
+ count($remainings));
+
+ foreach ($remainings as $path)
+ {
+ list($width, $height) = getimagesize($path);
+ $size = floor(filesize($path) / 1024).' KB';
+
+ $template->append(
+ 'remainings',
+ array(
+ 'PATH'=>$path,
+ 'FILESIZE_IMG'=>$size,
+ 'WIDTH_IMG'=>$width,
+ 'HEIGHT_IMG'=>$height,
+ ));
+ }
+}
+
+// +-----------------------------------------------------------------------+
+// | return to admin |
+// +-----------------------------------------------------------------------+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'thumbnail');
+?>