X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fimagefile.php;h=88f46148140b3d9904074e583d5dc74bc7fafc84;hb=5e27d53947ff64c8aee1b2287e1c77bbeaea51f7;hp=f9f47a47ee5a8f3f4d1e5bb6025a0c41005b45d8;hpb=746a5d75071a2a7c913c522ea78f2b88b87f4ce2;p=quix0rs-gnu-social.git diff --git a/lib/imagefile.php b/lib/imagefile.php index f9f47a47ee..88f4614814 100644 --- a/lib/imagefile.php +++ b/lib/imagefile.php @@ -1,6 +1,6 @@ . * * @category Image - * @package Laconica - * @author Evan Prodromou - * @author Zach Copley - * @copyright 2008-2009 Control Yourself, Inc. + * @package StatusNet + * @author Evan Prodromou + * @author Zach Copley + * @copyright 2008-2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ -if (!defined('LACONICA')) { +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } @@ -38,11 +38,11 @@ if (!defined('LACONICA')) { * Makes it slightly easier to accept an image file from upload. * * @category Image - * @package Laconica - * @author Evan Prodromou - * @author Zach Copley + * @package StatusNet + * @author Evan Prodromou + * @author Zach Copley * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ class ImageFile @@ -58,7 +58,7 @@ class ImageFile { $this->id = $id; $this->filepath = $filepath; - + $info = @getimagesize($this->filepath); $this->type = ($info) ? $info[2]:$type; $this->width = ($info) ? $info[0]:$width; @@ -68,33 +68,34 @@ class ImageFile static function fromUpload($param='upload') { switch ($_FILES[$param]['error']) { - case UPLOAD_ERR_OK: // success, jump out + case UPLOAD_ERR_OK: // success, jump out break; - case UPLOAD_ERR_INI_SIZE: - case UPLOAD_ERR_FORM_SIZE: - throw new Exception(_('That file is too big. The maximum file size is '.$this->maxFileSize().'.')); + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + throw new Exception(sprintf(_('That file is too big. The maximum file size is %d.'), + ImageFile::maxFileSize())); return; - case UPLOAD_ERR_PARTIAL: + case UPLOAD_ERR_PARTIAL: @unlink($_FILES[$param]['tmp_name']); throw new Exception(_('Partial upload.')); return; - default: + default: throw new Exception(_('System error uploading file.')); return; } - + $info = @getimagesize($_FILES[$param]['tmp_name']); - + if (!$info) { @unlink($_FILES[$param]['tmp_name']); throw new Exception(_('Not an image or corrupt file.')); return; } - + if ($info[2] !== IMAGETYPE_GIF && $info[2] !== IMAGETYPE_JPEG && $info[2] !== IMAGETYPE_PNG) { - + @unlink($_FILES[$param]['tmp_name']); throw new Exception(_('Unsupported image file format.')); return; @@ -102,7 +103,7 @@ class ImageFile return new ImageFile(null, $_FILES[$param]['tmp_name']); } - + function resize($size, $x = 0, $y = 0, $w = null, $h = null) { $w = ($w === null) ? $this->width:$w; @@ -113,6 +114,23 @@ class ImageFile return; } + // Don't crop/scale if it isn't necessary + if ($size === $this->width + && $size === $this->height + && $x === 0 + && $y === 0 + && $w === $this->width + && $h === $this->height) { + + $outname = Avatar::filename($this->id, + image_type_to_extension($this->type), + $size, + common_timestamp()); + $outpath = Avatar::path($outname); + @copy($this->filepath, $outpath); + return $outname; + } + switch ($this->type) { case IMAGETYPE_GIF: $image_src = imagecreatefromgif($this->filepath); @@ -129,43 +147,43 @@ class ImageFile } $image_dest = imagecreatetruecolor($size, $size); - + if ($this->type == IMAGETYPE_GIF || $this->type == IMAGETYPE_PNG) { $transparent_idx = imagecolortransparent($image_src); - + if ($transparent_idx >= 0) { - + $transparent_color = imagecolorsforindex($image_src, $transparent_idx); $transparent_idx = imagecolorallocate($image_dest, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); imagefill($image_dest, 0, 0, $transparent_idx); imagecolortransparent($image_dest, $transparent_idx); - + } elseif ($this->type == IMAGETYPE_PNG) { - + imagealphablending($image_dest, false); $transparent = imagecolorallocatealpha($image_dest, 0, 0, 0, 127); imagefill($image_dest, 0, 0, $transparent); imagesavealpha($image_dest, true); - + } } imagecopyresampled($image_dest, $image_src, 0, 0, $x, $y, $size, $size, $w, $h); - $outname = common_avatar_filename($this->id, - image_type_to_extension($this->type), - $size, - common_timestamp()); + $outname = Avatar::filename($this->id, + image_type_to_extension($this->type), + $size, + common_timestamp()); - $outpath = common_avatar_path($outname); + $outpath = Avatar::path($outname); switch ($this->type) { case IMAGETYPE_GIF: imagegif($image_dest, $outpath); break; case IMAGETYPE_JPEG: - imagejpeg($image_dest, $outpath); + imagejpeg($image_dest, $outpath, 100); break; case IMAGETYPE_PNG: imagepng($image_dest, $outpath); @@ -175,6 +193,9 @@ class ImageFile return; } + imagedestroy($image_src); + imagedestroy($image_dest); + return $outname; } @@ -182,27 +203,41 @@ class ImageFile { @unlink($this->filename); } - + static function maxFileSize() { - $limit = min(ImageFile::strToInt(ini_get('post_max_size')), ImageFile::strToInt(ini_get('upload_max_filesize'))); - return ($limit/(1024*1024)).'MB'; + $value = ImageFile::maxFileSizeInt(); + + if ($value > 1024 * 1024) { + return ($value/(1024*1024)).'Mb'; + } else if ($value > 1024) { + return ($value/(1024)).'kB'; + } else { + return $value; + } + } + + static function maxFileSizeInt() + { + return min(ImageFile::strToInt(ini_get('post_max_size')), + ImageFile::strToInt(ini_get('upload_max_filesize')), + ImageFile::strToInt(ini_get('memory_limit'))); } - + static function strToInt($str) { $unit = substr($str, -1); $num = substr($str, 0, -1); - + switch(strtoupper($unit)){ - case 'G': - $num *= 1024; - case 'M': - $num *= 1024; - case 'K': - $num *= 1024; + case 'G': + $num *= 1024; + case 'M': + $num *= 1024; + case 'K': + $num *= 1024; } - + return $num; } } \ No newline at end of file