X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Fimagefile.php;h=cf1668f20373a092c791e71a706608493d0848a8;hb=eeae20c1010e75c955a9ec0caffd3fc8165aa65c;hp=7f1db892c175e79284c3c40cb8cf74e583e0670d;hpb=9dc5d8d0f6db1249a62162877c81d240fcf32a0a;p=quix0rs-gnu-social.git diff --git a/lib/imagefile.php b/lib/imagefile.php index 7f1db892c1..cf1668f203 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,76 +38,211 @@ 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 { - var $filename = null; - var $barename = null; - var $type = null; - var $height = null; - var $width = null; + var $id; + var $filepath; + var $barename; + var $type; + var $height; + var $width; - function __construct($filename=null, $type=null, $width=null, $height=null) + function __construct($id=null, $filepath=null, $type=null, $width=null, $height=null) { - $this->filename = $filename; - $this->type = $type; - $this->width = $type; - $this->height = $type; + $this->id = $id; + $this->filepath = $filepath; + + $info = @getimagesize($this->filepath); + $this->type = ($info) ? $info[2]:$type; + $this->width = ($info) ? $info[0]:$width; + $this->height = ($info) ? $info[1]:$height; } 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.')); + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + throw new Exception(sprintf(_('That file is too big. The maximum file size is %s.'), + ImageFile::maxFileSize())); return; - case UPLOAD_ERR_PARTIAL: + case UPLOAD_ERR_PARTIAL: @unlink($_FILES[$param]['tmp_name']); throw new Exception(_('Partial upload.')); return; - default: + case UPLOAD_ERR_NO_FILE: + // No file; probably just a non-AJAX submission. + return; + default: + common_log(LOG_ERR, __METHOD__ . ": Unknown upload error " . + $_FILES[$param]['error']); throw new Exception(_('System error uploading file.')); return; } - $imagefile = new ImageFile($_FILES[$param]['tmp_name']); - $info = @getimagesize($imagefile->filename); + $info = @getimagesize($_FILES[$param]['tmp_name']); if (!$info) { - @unlink($imagefile->filename); + @unlink($_FILES[$param]['tmp_name']); throw new Exception(_('Not an image or corrupt file.')); return; } - $imagefile->width = $info[0]; - $imagefile->height = $info[1]; + if ($info[2] !== IMAGETYPE_GIF && + $info[2] !== IMAGETYPE_JPEG && + $info[2] !== IMAGETYPE_PNG) { - switch ($info[2]) { - case IMAGETYPE_GIF: - case IMAGETYPE_JPEG: - case IMAGETYPE_PNG: - $imagefile->type = $info[2]; - break; - default: - @unlink($imagefile->filename); + @unlink($_FILES[$param]['tmp_name']); throw new Exception(_('Unsupported image file format.')); return; } - return $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; + $h = ($h === null) ? $this->height:$h; + + if (!file_exists($this->filepath)) { + throw new Exception(_('Lost our file.')); + 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); + break; + case IMAGETYPE_JPEG: + $image_src = imagecreatefromjpeg($this->filepath); + break; + case IMAGETYPE_PNG: + $image_src = imagecreatefrompng($this->filepath); + break; + default: + throw new Exception(_('Unknown file type')); + return; + } + + $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 = Avatar::filename($this->id, + image_type_to_extension($this->type), + $size, + common_timestamp()); + + $outpath = Avatar::path($outname); + + switch ($this->type) { + case IMAGETYPE_GIF: + imagegif($image_dest, $outpath); + break; + case IMAGETYPE_JPEG: + imagejpeg($image_dest, $outpath, 100); + break; + case IMAGETYPE_PNG: + imagepng($image_dest, $outpath); + break; + default: + throw new Exception(_('Unknown file type')); + return; + } + + imagedestroy($image_src); + imagedestroy($image_dest); + + return $outname; } function unlink() { @unlink($this->filename); } + + static function maxFileSize() + { + $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; + } + + return $num; + } } \ No newline at end of file