📄 phpthumb.class.php
字号:
$this->DebugMessage('$this->thumbnailQuality set to "'.$this->thumbnailQuality.'"', __FILE__, __LINE__);
return true;
}
function setCacheDirectory() {
// resolve cache directory to absolute pathname
if (substr($this->config_cache_directory, 0, 1) == '.') {
if (eregi('^(f|ht)tps?://', $this->src)) {
if (!$this->config_cache_disable_warning && !$this->phpThumbDebug) {
$this->ErrorImage('$this->config_cache_directory ('.$this->config_cache_directory.') cannot be used for remote images. Adjust "cache_directory" or "cache_disable_warning" in phpThumb.config.php');
}
} elseif ($this->src) {
// resolve relative cache directory to source image
$this->config_cache_directory = dirname($this->ResolveFilenameToAbsolute($this->src)).$this->osslash.$this->config_cache_directory;
} else {
// $this->new is probably set
}
}
if (substr($this->config_cache_directory, -1) == '/') {
$this->config_cache_directory = substr($this->config_cache_directory, 0, -1);
}
if ($this->iswindows) {
$this->config_cache_directory = str_replace('/', $this->osslash, $this->config_cache_directory);
}
if ($this->config_cache_directory) {
$real_cache_path = realpath($this->config_cache_directory);
if (!$real_cache_path) {
$this->DebugMessage('realpath($this->config_cache_directory) failed for "'.$this->config_cache_directory.'"', __FILE__, __LINE__);
if (!is_dir($this->config_cache_directory)) {
$this->DebugMessage('!is_dir('.$this->config_cache_directory.')', __FILE__, __LINE__);
}
}
if ($real_cache_path) {
$this->config_cache_directory = $real_cache_path;
}
}
if (!is_dir($this->config_cache_directory)) {
if (!$this->config_cache_disable_warning && !$this->phpThumbDebug) {
$this->ErrorImage('$this->config_cache_directory ('.$this->config_cache_directory.') does not exist. Adjust "cache_directory" or "cache_disable_warning" in phpThumb.config.php');
}
$this->DebugMessage('$this->config_cache_directory ('.$this->config_cache_directory.') is not a directory', __FILE__, __LINE__);
$this->config_cache_directory = null;
} elseif (!is_writable($this->config_cache_directory)) {
$this->DebugMessage('$this->config_cache_directory is not writable ('.$this->config_cache_directory.')', __FILE__, __LINE__);
}
return true;
}
function ResolveFilenameToAbsolute($filename) {
if (eregi('^(f|ht)tps?://', $filename)) {
// URL
$AbsoluteFilename = $filename;
} elseif ($this->iswindows && ($filename{1} == ':')) {
// absolute pathname (Windows)
$AbsoluteFilename = $filename;
} elseif ($this->iswindows && ((substr($filename, 0, 2) == '//') || (substr($filename, 0, 2) == '\\\\'))) {
// absolute pathname (Windows)
$AbsoluteFilename = $filename;
} elseif ($filename{0} == '/') {
if (@is_readable($filename) && !@is_readable($this->config_document_root.$filename)) {
// absolute filename (*nix)
$AbsoluteFilename = $filename;
} elseif ($filename{1} == '~') {
// /~user/path
if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray($filename)) {
$AbsoluteFilename = $ApacheLookupURIarray['filename'];
} else {
$AbsoluteFilename = realpath($filename);
if (@is_readable($AbsoluteFilename)) {
$this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.$filename.'", but the correct filename ('.$AbsoluteFilename.') seems to have been resolved with realpath($filename)', __FILE__, __LINE__);
} else {
if ($this->phpThumbDebug) {
$this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.$filename.'". This has been known to fail on Apache2 - try using the absolute filename for the source image');
return false;
} else {
return $this->ErrorImage('phpthumb_functions::ApacheLookupURIarray() failed for "'.$filename.'". This has been known to fail on Apache2 - try using the absolute filename for the source image');
}
}
}
} else {
// relative filename (any OS)
$AbsoluteFilename = $this->config_document_root.$filename;
}
} else {
// relative to current directory (any OS)
$AbsoluteFilename = $this->config_document_root.dirname(@$_SERVER['PHP_SELF']).$this->osslash.$filename;
//if (!file_exists($AbsoluteFilename) && file_exists(realpath($this->DotPadRelativeDirectoryPath($filename)))) {
// $AbsoluteFilename = realpath($this->DotPadRelativeDirectoryPath($filename));
//}
if (substr(dirname(@$_SERVER['PHP_SELF']), 0, 2) == '/~') {
if ($ApacheLookupURIarray = phpthumb_functions::ApacheLookupURIarray(dirname(@$_SERVER['PHP_SELF']))) {
$AbsoluteFilename = $ApacheLookupURIarray['filename'].$this->osslash.$filename;
} else {
$AbsoluteFilename = realpath('.').$this->osslash.$filename;
if (@is_readable($AbsoluteFilename)) {
$this->DebugMessage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname(@$_SERVER['PHP_SELF']).'", but the correct filename ('.$AbsoluteFilename.') seems to have been resolved with realpath(.)/$filename', __FILE__, __LINE__);
} else {
return $this->ErrorImage('phpthumb_functions::ApacheLookupURIarray() failed for "'.dirname(@$_SERVER['PHP_SELF']).'". This has been known to fail on Apache2 - try using the absolute filename for the source image');
}
}
}
}
if (is_link($AbsoluteFilename)) {
$this->DebugMessage('is_link()==true, changing "'.$AbsoluteFilename.'" to "'.readlink($AbsoluteFilename).'"', __FILE__, __LINE__);
$AbsoluteFilename = readlink($AbsoluteFilename);
}
if (realpath($AbsoluteFilename)) {
$AbsoluteFilename = realpath($AbsoluteFilename);
}
if ($this->iswindows) {
$AbsoluteFilename = eregi_replace('^'.preg_quote(realpath($this->config_document_root)), realpath($this->config_document_root), $AbsoluteFilename);
$AbsoluteFilename = str_replace($this->osslash, '/', $AbsoluteFilename);
}
if (!$this->config_allow_src_above_docroot && !ereg('^'.preg_quote(str_replace($this->osslash, '/', realpath($this->config_document_root))), $AbsoluteFilename)) {
$this->DebugMessage('!$this->config_allow_src_above_docroot therefore setting "'.$AbsoluteFilename.'" to null', __FILE__, __LINE__);
return false;
}
if (!$this->config_allow_src_above_phpthumb && !ereg('^'.preg_quote(str_replace($this->osslash, '/', dirname(__FILE__))), $AbsoluteFilename)) {
$this->DebugMessage('!$this->config_allow_src_above_phpthumb therefore setting "'.$AbsoluteFilename.'" to null', __FILE__, __LINE__);
return false;
}
return $AbsoluteFilename;
}
function ImageMagickCommandlineBase() {
static $commandline = null;
if (is_null($commandline)) {
$commandline = '';
$which_convert = trim(phpthumb_functions::SafeExec('which convert'));
if ($this->config_imagemagick_path && ($this->config_imagemagick_path != realpath($this->config_imagemagick_path))) {
$this->DebugMessage('Changing $this->config_imagemagick_path ('.$this->config_imagemagick_path.') to realpath($this->config_imagemagick_path) ('.realpath($this->config_imagemagick_path).')', __FILE__, __LINE__);
$this->config_imagemagick_path = realpath($this->config_imagemagick_path);
}
if (file_exists($this->config_imagemagick_path)) {
$this->DebugMessage('using ImageMagick path from $this->config_imagemagick_path ('.$this->config_imagemagick_path.')', __FILE__, __LINE__);
if ($this->iswindows) {
$commandline = substr($this->config_imagemagick_path, 0, 2).' && cd "'.substr(dirname($this->config_imagemagick_path), 2).'" && '.basename($this->config_imagemagick_path);
} else {
$commandline = '"'.$this->config_imagemagick_path.'"';
}
} elseif ($which_convert && ($which_convert{0} == '/') && @file_exists($which_convert)) {
// `which convert` *should* return the path if "convert" exist, or nothing if it doesn't
// other things *may* get returned, like "sh: convert: not found" or "no convert in /usr/local/bin /usr/sbin /usr/bin /usr/ccs/bin"
// so only do this if the value returned exists as a file
$this->DebugMessage('using ImageMagick path from `which convert` ('.$which_convert.')', __FILE__, __LINE__);
$commandline = 'convert';
} else {
$this->DebugMessage('ImageMagickThumbnailToGD() aborting because cannot find convert in $this->config_imagemagick_path ('.$this->config_imagemagick_path.'), and `which convert` returned ('.$which_convert.')', __FILE__, __LINE__);
}
}
return $commandline;
}
function ImageMagickVersion() {
$commandline = $this->ImageMagickCommandlineBase();
if ($commandline) {
$commandline .= ' -version';
$versionstring = phpthumb_functions::SafeExec($commandline);
if (eregi('^Version: (.*) http', $versionstring, $matches)) {
return $matches[1];
}
$this->DebugMessage('ImageMagick did not return recognized version string ('.$versionstring.')', __FILE__, __LINE__);
return $versionstring;
}
return false;
}
function ImageMagickThumbnailToGD() {
// http://freealter.org/doc_distrib/ImageMagick-5.1.1/www/convert.html
if (ini_get('safe_mode')) {
$this->DebugMessage('ImageMagickThumbnailToGD() aborting because safe_mode is enabled', __FILE__, __LINE__);
return false;
}
if (!function_exists('ImageCreateFromPNG')) {
// ImageMagickThumbnailToGD() depends on ImageCreateFromPNG()
$this->DebugMessage('ImageMagickThumbnailToGD() aborting because ImageCreateFromPNG() is not available', __FILE__, __LINE__);
return false;
}
$commandline = $this->ImageMagickCommandlineBase();
if ($commandline) {
if ($IMtempfilename = $this->phpThumb_tempnam()) {
$IMtempfilename = realpath($IMtempfilename);
$this->source_width = max($this->w, $this->wp, $this->wl, $this->ws);
$this->source_height = max($this->h, $this->hp, $this->hl, $this->hs);
$this->DebugMessage('source dimensions set to '.$this->source_width.'x'.$this->source_height, __FILE__, __LINE__);
if (!$this->aoe && !$this->iar && ($getimagesize = @GetImageSize($this->sourceFilename))) {
// limit output size to input size unless AllowOutputEnlargement is enabled
$this->source_width = min($this->source_width, $getimagesize[0]);
$this->source_height = min($this->source_height, $getimagesize[1]);
$this->DebugMessage('source dimensions reset to '.$this->source_width.'x'.$this->source_height, __FILE__, __LINE__);
$this->SetOrientationDependantWidthHeight();
if ($this->zc) {
$ar = max($getimagesize[0] / $getimagesize[1], $getimagesize[1] / $getimagesize[0]);
$this->source_width = round($this->source_width * $ar);
$this->source_height = round($this->source_height * $ar);
$this->DebugMessage('source dimensions reset by "zc" to '.$this->source_width.'x'.$this->source_height, __FILE__, __LINE__);
}
}
//$commandline .= ' -resize '.$this->source_width.'x'.$this->source_height; // behaves badly with IM v5.3.x
$commandline .= ' -geometry '.$this->source_width.'x'.$this->source_height;
if ($this->iar && (intval($this->w) > 0) && (intval($this->h) > 0)) {
$commandline .= '!';
}
$commandline .= ' "'.str_replace('/', $this->osslash, $this->sourceFilename).'"';
$commandline .= ' png:'.$IMtempfilename;
$commandline .= ' 2>&1';
$this->DebugMessage('ImageMagick called as ('.$commandline.')', __FILE__, __LINE__);
$IMresult = phpthumb_functions::SafeExec($commandline);
if ($IMresult) {
//return $this->ErrorImage('ImageMagick was called as:'."\n".$commandline."\n\n".'but failed with message:'."\n".$IMresult);
$this->DebugMessage('ImageMagick failed with message ('.$IMresult.')', __FILE__, __LINE__);
} elseif ($this->gdimg_source = @ImageCreateFromPNG($IMtempfilename)) {
@unlink($IMtempfilename);
$this->source_width = ImageSX($this->gdimg_source);
$this->source_height = ImageSY($this->gdimg_source);
$this->DebugMessage('ImageMagickThumbnailToGD() succeeded, $this->gdimg_source is now ('.$this->source_width.'x'.$this->source_height.')', __FILE__, __LINE__);
return true;
}
unlink($IMtempfilename);
} else {
$this->DebugMessage('ImageMagickThumbnailToGD() aborting, phpThumb_tempnam() failed', __FILE__, __LINE__);
}
}
$this->DebugMessage('ImageMagickThumbnailToGD() aborting because ImageMagickCommandlineBase() failed', __FILE__, __LINE__);
return false;
}
function Rotate() {
if ($this->ra || $this->ar) {
if (!function_exists('ImageRotate')) {
$this->DebugMessage('!function_exists(ImageRotate)', __FILE__, __LINE__);
return false;
}
if (!include_once(dirname(__FILE__).'/phpthumb.filters.php')) {
$this->DebugMessage('Error including "'.dirname(__FILE__).'/phpthumb.filters.php" which is required for applying filters ('.implode(';', $this->fltr).')', __FILE__, __LINE__);
return false;
}
$this->config_background_hexcolor = ($this->bg ? $this->bg : $this->config_background_hexcolor);
if (!phpthumb_functions::IsHexColor($this->config_background_hexcolor)) {
return $this->ErrorImage('Invalid hex color string "'.$this->config_background_hexcolor.'" for parameter "bg"');
}
$rotate_angle = 0;
if ($this->ra) {
$rotate_angle = floatval($this->ra);
} else {
if ($this->ar == 'x') {
if (phpthumb_functions::version_compare_replacement(phpversion(), '4.2.0', '>=')) {
if ($this->sourceFilename) {
if (function_exists('exif_read_data')) {
if ($exif_data = @exif_read_data($this->sourceFilename, 'IFD0')) {
// http://sylvana.net/jpegcrop/exif_orientation.html
switch (@$exif_data['Orientation']) {
case 1:
$rotate_angle = 0;
break;
case 3:
$rotate_angle = 180;
break;
case 6:
$rotate_angle = 270;
break;
case 8:
$rotate_angle = 90;
break;
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -