6 |
kaklik |
1 |
<?php
|
|
|
2 |
// +-----------------------------------------------------------------------+
|
|
|
3 |
// | PhpWebGallery - a PHP based picture gallery |
|
|
|
4 |
// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
|
|
|
5 |
// | Copyright (C) 2003-2005 PhpWebGallery Team - http://phpwebgallery.net |
|
|
|
6 |
// +-----------------------------------------------------------------------+
|
|
|
7 |
// | branch : BSF (Best So Far)
|
|
|
8 |
// | file : $RCSfile: thumbnail.php,v $
|
|
|
9 |
// | last update : $Date: 2005/01/20 23:41:27 $
|
|
|
10 |
// | last modifier : $Author: plg $
|
|
|
11 |
// | revision : $Revision: 1.19 $
|
|
|
12 |
// +-----------------------------------------------------------------------+
|
|
|
13 |
// | This program is free software; you can redistribute it and/or modify |
|
|
|
14 |
// | it under the terms of the GNU General Public License as published by |
|
|
|
15 |
// | the Free Software Foundation |
|
|
|
16 |
// | |
|
|
|
17 |
// | This program is distributed in the hope that it will be useful, but |
|
|
|
18 |
// | WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
|
19 |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
|
|
20 |
// | General Public License for more details. |
|
|
|
21 |
// | |
|
|
|
22 |
// | You should have received a copy of the GNU General Public License |
|
|
|
23 |
// | along with this program; if not, write to the Free Software |
|
|
|
24 |
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
|
|
|
25 |
// | USA. |
|
|
|
26 |
// +-----------------------------------------------------------------------+
|
|
|
27 |
include_once( PHPWG_ROOT_PATH.'admin/include/isadmin.inc.php' );
|
|
|
28 |
//------------------------------------------------------------------- functions
|
|
|
29 |
// RatioResizeImg creates a new picture (a thumbnail since it is supposed to
|
|
|
30 |
// be smaller than original picture !) in the sub directory named
|
|
|
31 |
// "thumbnail".
|
|
|
32 |
function RatioResizeImg($path, $newWidth, $newHeight, $tn_ext)
|
|
|
33 |
{
|
|
|
34 |
global $conf, $lang, $errors;
|
|
|
35 |
|
|
|
36 |
$filename = basename($path);
|
|
|
37 |
$dirname = dirname($path);
|
|
|
38 |
|
|
|
39 |
// extension of the picture filename
|
|
|
40 |
$extension = get_extension($filename);
|
|
|
41 |
|
|
|
42 |
if ($extension == 'jpg' or $extension == 'JPG')
|
|
|
43 |
{
|
|
|
44 |
$srcImage = @imagecreatefromjpeg($path);
|
|
|
45 |
}
|
|
|
46 |
else if ($extension == 'png' or $extension == 'PNG')
|
|
|
47 |
{
|
|
|
48 |
$srcImage = @imagecreatefrompng($path);
|
|
|
49 |
}
|
|
|
50 |
else
|
|
|
51 |
{
|
|
|
52 |
unset($extension);
|
|
|
53 |
}
|
|
|
54 |
|
|
|
55 |
if ( isset( $srcImage ) )
|
|
|
56 |
{
|
|
|
57 |
// width/height
|
|
|
58 |
$srcWidth = imagesx( $srcImage );
|
|
|
59 |
$srcHeight = imagesy( $srcImage );
|
|
|
60 |
$ratioWidth = $srcWidth/$newWidth;
|
|
|
61 |
$ratioHeight = $srcHeight/$newHeight;
|
|
|
62 |
|
|
|
63 |
// maximal size exceeded ?
|
|
|
64 |
if ( ( $ratioWidth > 1 ) or ( $ratioHeight > 1 ) )
|
|
|
65 |
{
|
|
|
66 |
if ( $ratioWidth < $ratioHeight)
|
|
|
67 |
{
|
|
|
68 |
$destWidth = $srcWidth/$ratioHeight;
|
|
|
69 |
$destHeight = $newHeight;
|
|
|
70 |
}
|
|
|
71 |
else
|
|
|
72 |
{
|
|
|
73 |
$destWidth = $newWidth;
|
|
|
74 |
$destHeight = $srcHeight/$ratioWidth;
|
|
|
75 |
}
|
|
|
76 |
}
|
|
|
77 |
else
|
|
|
78 |
{
|
|
|
79 |
$destWidth = $srcWidth;
|
|
|
80 |
$destHeight = $srcHeight;
|
|
|
81 |
}
|
|
|
82 |
// according to the GD version installed on the server
|
|
|
83 |
if ( $_POST['gd'] == 2 )
|
|
|
84 |
{
|
|
|
85 |
// GD 2.0 or more recent -> good results (but slower)
|
|
|
86 |
$destImage = imagecreatetruecolor( $destWidth, $destHeight);
|
|
|
87 |
imagecopyresampled( $destImage, $srcImage, 0, 0, 0, 0,
|
|
|
88 |
$destWidth,$destHeight,$srcWidth,$srcHeight );
|
|
|
89 |
}
|
|
|
90 |
else
|
|
|
91 |
{
|
|
|
92 |
// GD prior to version 2 -> pretty bad results :-/ (but fast)
|
|
|
93 |
$destImage = imagecreate( $destWidth, $destHeight);
|
|
|
94 |
imagecopyresized( $destImage, $srcImage, 0, 0, 0, 0,
|
|
|
95 |
$destWidth,$destHeight,$srcWidth,$srcHeight );
|
|
|
96 |
}
|
|
|
97 |
|
|
|
98 |
$tndir = $dirname.'/thumbnail';
|
|
|
99 |
if (!is_dir($tndir))
|
|
|
100 |
{
|
|
|
101 |
if (!is_writable($dirname))
|
|
|
102 |
{
|
|
|
103 |
array_push($errors, '['.$dirname.'] : '.$lang['no_write_access']);
|
|
|
104 |
return false;
|
|
|
105 |
}
|
|
|
106 |
umask(0000);
|
|
|
107 |
mkdir($tndir, 0777);
|
|
|
108 |
}
|
|
|
109 |
|
|
|
110 |
$dest_file = $tndir.'/'.$conf['prefix_thumbnail'];
|
|
|
111 |
$dest_file.= get_filename_wo_extension($filename);
|
|
|
112 |
$dest_file.= '.'.$tn_ext;
|
|
|
113 |
|
|
|
114 |
// creation and backup of final picture
|
|
|
115 |
if (!is_writable($tndir))
|
|
|
116 |
{
|
|
|
117 |
array_push($errors, '['.$tndir.'] : '.$lang['no_write_access']);
|
|
|
118 |
return false;
|
|
|
119 |
}
|
|
|
120 |
imagejpeg($destImage, $dest_file);
|
|
|
121 |
// freeing memory ressources
|
|
|
122 |
imagedestroy( $srcImage );
|
|
|
123 |
imagedestroy( $destImage );
|
|
|
124 |
|
|
|
125 |
list($tn_width, $tn_height) = getimagesize($dest_file);
|
|
|
126 |
$tn_size = floor(filesize($dest_file) / 1024).' KB';
|
|
|
127 |
|
|
|
128 |
$info = array( 'path' => $path,
|
|
|
129 |
'tn_file' => $dest_file,
|
|
|
130 |
'tn_width' => $tn_width,
|
|
|
131 |
'tn_height' => $tn_height,
|
|
|
132 |
'tn_size' => $tn_size );
|
|
|
133 |
return $info;
|
|
|
134 |
}
|
|
|
135 |
// error
|
|
|
136 |
else
|
|
|
137 |
{
|
|
|
138 |
echo $lang['tn_no_support']." ";
|
|
|
139 |
if ( isset( $extenstion ) )
|
|
|
140 |
{
|
|
|
141 |
echo $lang['tn_format'].' '.$extension;
|
|
|
142 |
}
|
|
|
143 |
else
|
|
|
144 |
{
|
|
|
145 |
echo $lang['tn_thisformat'];
|
|
|
146 |
}
|
|
|
147 |
exit();
|
|
|
148 |
}
|
|
|
149 |
}
|
|
|
150 |
|
|
|
151 |
$errors = array();
|
|
|
152 |
$pictures = array();
|
|
|
153 |
$stats = array();
|
|
|
154 |
// +-----------------------------------------------------------------------+
|
|
|
155 |
// | template initialization |
|
|
|
156 |
// +-----------------------------------------------------------------------+
|
|
|
157 |
$template->set_filenames( array('thumbnail'=>'admin/thumbnail.tpl') );
|
|
|
158 |
|
|
|
159 |
$template->assign_vars(array(
|
|
|
160 |
'L_THUMBNAIL_TITLE'=>$lang['tn_dirs_title'],
|
|
|
161 |
'L_UNLINK'=>$lang['tn_no_missing'],
|
|
|
162 |
'L_MISSING_THUMBNAILS'=>$lang['tn_dirs_alone'],
|
|
|
163 |
'L_RESULTS'=>$lang['tn_results_title'],
|
|
|
164 |
'L_PATH'=>$lang['path'],
|
|
|
165 |
'L_FILESIZE'=>$lang['filesize'],
|
|
|
166 |
'L_WIDTH'=>$lang['tn_width'],
|
|
|
167 |
'L_HEIGHT'=>$lang['tn_height'],
|
|
|
168 |
'L_GENERATED'=>$lang['tn_results_gen_time'],
|
|
|
169 |
'L_THUMBNAIL'=>$lang['thumbnail'],
|
|
|
170 |
'L_PARAMS'=>$lang['tn_params_title'],
|
|
|
171 |
'L_GD'=>$lang['tn_params_GD'],
|
|
|
172 |
'L_GD_INFO'=>$lang['tn_params_GD_info'],
|
|
|
173 |
'L_WIDTH_INFO'=>$lang['tn_params_width_info'],
|
|
|
174 |
'L_HEIGHT_INFO'=>$lang['tn_params_height_info'],
|
|
|
175 |
'L_CREATE'=>$lang['tn_params_create'],
|
|
|
176 |
'L_CREATE_INFO'=>$lang['tn_params_create_info'],
|
|
|
177 |
'L_FORMAT'=>$lang['tn_params_format'],
|
|
|
178 |
'L_FORMAT_INFO'=>$lang['tn_params_format_info'],
|
|
|
179 |
'L_SUBMIT'=>$lang['submit'],
|
|
|
180 |
'L_REMAINING'=>$lang['tn_alone_title'],
|
|
|
181 |
'L_TN_STATS'=>$lang['tn_stats'],
|
|
|
182 |
'L_TN_NB_STATS'=>$lang['tn_stats_nb'],
|
|
|
183 |
'L_TN_TOTAL'=>$lang['tn_stats_total'],
|
|
|
184 |
'L_TN_MAX'=>$lang['tn_stats_max'],
|
|
|
185 |
'L_TN_MIN'=>$lang['tn_stats_min'],
|
|
|
186 |
'L_TN_AVERAGE'=>$lang['tn_stats_mean'],
|
|
|
187 |
'L_ALL'=>$lang['tn_all'],
|
|
|
188 |
|
|
|
189 |
'T_STYLE'=>$user['template']
|
|
|
190 |
));
|
|
|
191 |
// +-----------------------------------------------------------------------+
|
|
|
192 |
// | search pictures without thumbnails |
|
|
|
193 |
// +-----------------------------------------------------------------------+
|
|
|
194 |
$wo_thumbnails = array();
|
|
|
195 |
$thumbnalized = array();
|
|
|
196 |
|
|
|
197 |
// what is the directory to search in ?
|
|
|
198 |
$query = '
|
|
|
199 |
SELECT galleries_url
|
|
|
200 |
FROM '.SITES_TABLE.'
|
|
|
201 |
WHERE id = 1
|
|
|
202 |
;';
|
|
|
203 |
list($galleries_url) = mysql_fetch_array(pwg_query($query));
|
|
|
204 |
$basedir = preg_replace('#/*$#', '', $galleries_url);
|
|
|
205 |
|
|
|
206 |
$fs = get_fs($basedir);
|
|
|
207 |
// because isset is one hundred time faster than in_array
|
|
|
208 |
$fs['thumbnails'] = array_flip($fs['thumbnails']);
|
|
|
209 |
|
|
|
210 |
foreach ($fs['elements'] as $path)
|
|
|
211 |
{
|
|
|
212 |
// only pictures need thumbnails
|
|
|
213 |
if (in_array(get_extension($path), $conf['picture_ext']))
|
|
|
214 |
{
|
|
|
215 |
$dirname = dirname($path);
|
|
|
216 |
$filename = basename($path);
|
|
|
217 |
|
|
|
218 |
// only files matching the authorized filename pattern can be considered
|
|
|
219 |
// as "without thumbnail"
|
|
|
220 |
if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $filename))
|
|
|
221 |
{
|
|
|
222 |
continue;
|
|
|
223 |
}
|
|
|
224 |
|
|
|
225 |
// searching the element
|
|
|
226 |
$filename_wo_ext = get_filename_wo_extension($filename);
|
|
|
227 |
$tn_ext = '';
|
|
|
228 |
$base_test = $dirname.'/thumbnail/';
|
|
|
229 |
$base_test.= $conf['prefix_thumbnail'].$filename_wo_ext.'.';
|
|
|
230 |
foreach ($conf['picture_ext'] as $ext)
|
|
|
231 |
{
|
|
|
232 |
if (isset($fs['thumbnails'][$base_test.$ext]))
|
|
|
233 |
{
|
|
|
234 |
$tn_ext = $ext;
|
|
|
235 |
break;
|
|
|
236 |
}
|
|
|
237 |
}
|
|
|
238 |
|
|
|
239 |
if (empty($tn_ext))
|
|
|
240 |
{
|
|
|
241 |
array_push($wo_thumbnails, $path);
|
|
|
242 |
}
|
|
|
243 |
}
|
|
|
244 |
}
|
|
|
245 |
// +-----------------------------------------------------------------------+
|
|
|
246 |
// | thumbnails creation |
|
|
|
247 |
// +-----------------------------------------------------------------------+
|
|
|
248 |
if (isset($_POST['submit']))
|
|
|
249 |
{
|
|
|
250 |
$errors = array();
|
|
|
251 |
$times = array();
|
|
|
252 |
$infos = array();
|
|
|
253 |
|
|
|
254 |
// checking criteria
|
|
|
255 |
if (!ereg('^[0-9]{2,3}$', $_POST['width']) or $_POST['width'] < 10)
|
|
|
256 |
{
|
|
|
257 |
array_push($errors, $lang['tn_err_width'].' 10');
|
|
|
258 |
}
|
|
|
259 |
if (!ereg('^[0-9]{2,3}$', $_POST['height']) or $_POST['height'] < 10)
|
|
|
260 |
{
|
|
|
261 |
array_push($errors, $lang['tn_err_height'].' 10');
|
|
|
262 |
}
|
|
|
263 |
|
|
|
264 |
// picture miniaturization
|
|
|
265 |
if (count($errors) == 0)
|
|
|
266 |
{
|
|
|
267 |
$num = 1;
|
|
|
268 |
foreach ($wo_thumbnails as $path)
|
|
|
269 |
{
|
|
|
270 |
if (is_numeric($_POST['n']) and $num > $_POST['n'])
|
|
|
271 |
{
|
|
|
272 |
break;
|
|
|
273 |
}
|
|
|
274 |
|
|
|
275 |
$starttime = get_moment();
|
|
|
276 |
if ($info = RatioResizeImg($path,$_POST['width'],$_POST['height'],'jpg'))
|
|
|
277 |
{
|
|
|
278 |
$endtime = get_moment();
|
|
|
279 |
$info['time'] = ($endtime - $starttime) * 1000;
|
|
|
280 |
array_push($infos, $info);
|
|
|
281 |
array_push($times, $info['time']);
|
|
|
282 |
array_push($thumbnalized, $path);
|
|
|
283 |
$num++;
|
|
|
284 |
}
|
|
|
285 |
else
|
|
|
286 |
{
|
|
|
287 |
break;
|
|
|
288 |
}
|
|
|
289 |
}
|
|
|
290 |
|
|
|
291 |
if (count($infos) > 0)
|
|
|
292 |
{
|
|
|
293 |
$sum = array_sum($times);
|
|
|
294 |
$average = $sum / count($times);
|
|
|
295 |
sort($times, SORT_NUMERIC);
|
|
|
296 |
$max = array_pop($times);
|
|
|
297 |
if (count($thumbnalized) == 1)
|
|
|
298 |
{
|
|
|
299 |
$min = $max;
|
|
|
300 |
}
|
|
|
301 |
else
|
|
|
302 |
{
|
|
|
303 |
$min = array_shift($times);
|
|
|
304 |
}
|
|
|
305 |
|
|
|
306 |
$template->assign_block_vars(
|
|
|
307 |
'results',
|
|
|
308 |
array(
|
|
|
309 |
'TN_NB'=>count($infos),
|
|
|
310 |
'TN_TOTAL'=>number_format($sum, 2, '.', ' ').' ms',
|
|
|
311 |
'TN_MAX'=>number_format($max, 2, '.', ' ').' ms',
|
|
|
312 |
'TN_MIN'=>number_format($min, 2, '.', ' ').' ms',
|
|
|
313 |
'TN_AVERAGE'=>number_format($average, 2, '.', ' ').' ms'
|
|
|
314 |
));
|
|
|
315 |
|
|
|
316 |
foreach ($infos as $i => $info)
|
|
|
317 |
{
|
|
|
318 |
if ($info['time'] == $max)
|
|
|
319 |
{
|
|
|
320 |
$class = 'worst_gen_time';
|
|
|
321 |
}
|
|
|
322 |
else if ($info['time'] == $min)
|
|
|
323 |
{
|
|
|
324 |
$class = 'best_gen_time';
|
|
|
325 |
}
|
|
|
326 |
else
|
|
|
327 |
{
|
|
|
328 |
$class = '';
|
|
|
329 |
}
|
|
|
330 |
|
|
|
331 |
$template->assign_block_vars(
|
|
|
332 |
'results.picture',
|
|
|
333 |
array(
|
|
|
334 |
'PATH'=>$info['path'],
|
|
|
335 |
'TN_FILE_IMG'=>$info['tn_file'],
|
|
|
336 |
'TN_FILESIZE_IMG'=>$info['tn_size'],
|
|
|
337 |
'TN_WIDTH_IMG'=>$info['tn_width'],
|
|
|
338 |
'TN_HEIGHT_IMG'=>$info['tn_height'],
|
|
|
339 |
'GEN_TIME'=>number_format($info['time'], 2, '.', ' ').' ms',
|
|
|
340 |
|
|
|
341 |
'T_CLASS'=>$class
|
|
|
342 |
));
|
|
|
343 |
}
|
|
|
344 |
}
|
|
|
345 |
}
|
|
|
346 |
}
|
|
|
347 |
// +-----------------------------------------------------------------------+
|
|
|
348 |
// | errors display |
|
|
|
349 |
// +-----------------------------------------------------------------------+
|
|
|
350 |
if (count($errors) != 0)
|
|
|
351 |
{
|
|
|
352 |
$template->assign_block_vars('errors',array());
|
|
|
353 |
foreach ($errors as $error)
|
|
|
354 |
{
|
|
|
355 |
$template->assign_block_vars('errors.error',array('ERROR'=>$error));
|
|
|
356 |
}
|
|
|
357 |
}
|
|
|
358 |
// +-----------------------------------------------------------------------+
|
|
|
359 |
// | form & pictures without thumbnails display |
|
|
|
360 |
// +-----------------------------------------------------------------------+
|
|
|
361 |
$remainings = array_diff($wo_thumbnails, $thumbnalized);
|
|
|
362 |
|
|
|
363 |
if (count($remainings) > 0)
|
|
|
364 |
{
|
|
|
365 |
$form_url = PHPWG_ROOT_PATH.'admin.php?page=thumbnail';
|
|
|
366 |
$gd = !empty($_POST['gd']) ? $_POST['gd'] : 2;
|
|
|
367 |
$width = !empty($_POST['width']) ? $_POST['width'] : $conf['tn_width'];
|
|
|
368 |
$height = !empty($_POST['height']) ? $_POST['height'] : $conf['tn_height'];
|
|
|
369 |
$n = !empty($_POST['n']) ? $_POST['n'] : 5;
|
|
|
370 |
|
|
|
371 |
$gdlabel = 'GD'.$gd.'_CHECKED';
|
|
|
372 |
$nlabel = 'n_'.$n.'_CHECKED';
|
|
|
373 |
|
|
|
374 |
$template->assign_block_vars(
|
|
|
375 |
'params',
|
|
|
376 |
array(
|
|
|
377 |
'F_ACTION'=>add_session_id($form_url),
|
|
|
378 |
$gdlabel=>'checked="checked"',
|
|
|
379 |
$nlabel=>'checked="checked"',
|
|
|
380 |
'WIDTH_TN'=>$width,
|
|
|
381 |
'HEIGHT_TN'=>$height
|
|
|
382 |
));
|
|
|
383 |
|
|
|
384 |
$template->assign_block_vars(
|
|
|
385 |
'remainings',
|
|
|
386 |
array('TOTAL_IMG'=>count($remainings)));
|
|
|
387 |
|
|
|
388 |
$num = 1;
|
|
|
389 |
foreach ($remainings as $path)
|
|
|
390 |
{
|
|
|
391 |
$class = ($num % 2) ? 'row1' : 'row2';
|
|
|
392 |
list($width, $height) = getimagesize($path);
|
|
|
393 |
$size = floor(filesize($path) / 1024).' KB';
|
|
|
394 |
|
|
|
395 |
$template->assign_block_vars(
|
|
|
396 |
'remainings.remaining',
|
|
|
397 |
array(
|
|
|
398 |
'NB_IMG'=>($num),
|
|
|
399 |
'PATH'=>$path,
|
|
|
400 |
'FILESIZE_IMG'=>$size,
|
|
|
401 |
'WIDTH_IMG'=>$width,
|
|
|
402 |
'HEIGHT_IMG'=>$height,
|
|
|
403 |
|
|
|
404 |
'T_CLASS'=>$class
|
|
|
405 |
));
|
|
|
406 |
|
|
|
407 |
$num++;
|
|
|
408 |
}
|
|
|
409 |
}
|
|
|
410 |
else
|
|
|
411 |
{
|
|
|
412 |
$template->assign_block_vars('warning', array());
|
|
|
413 |
}
|
|
|
414 |
// +-----------------------------------------------------------------------+
|
|
|
415 |
// | return to admin |
|
|
|
416 |
// +-----------------------------------------------------------------------+
|
|
|
417 |
$template->assign_var_from_handle('ADMIN_CONTENT', 'thumbnail');
|
|
|
418 |
?>
|