Fixed #1134; Consolidated image scaling functions.
This commit is contained in:
parent
5c880bc6cc
commit
7e975b17c5
@ -34,6 +34,8 @@ if (!defined('LACONICA')) {
|
||||
|
||||
require_once INSTALLDIR.'/lib/accountsettingsaction.php';
|
||||
|
||||
define('MAX_ORIGINAL', 480);
|
||||
|
||||
/**
|
||||
* Upload an avatar
|
||||
*
|
||||
@ -286,7 +288,7 @@ class AvatarsettingsAction extends AccountSettingsAction
|
||||
|
||||
$filepath = common_avatar_path($filename);
|
||||
|
||||
move_uploaded_file($imagefile->filename, $filepath);
|
||||
move_uploaded_file($imagefile->filepath, $filepath);
|
||||
|
||||
$filedata = array('filename' => $filename,
|
||||
'filepath' => $filepath,
|
||||
@ -312,15 +314,6 @@ class AvatarsettingsAction extends AccountSettingsAction
|
||||
|
||||
function cropAvatar()
|
||||
{
|
||||
$user = common_current_user();
|
||||
|
||||
$profile = $user->getProfile();
|
||||
|
||||
$x = $this->arg('avatar_crop_x');
|
||||
$y = $this->arg('avatar_crop_y');
|
||||
$w = $this->arg('avatar_crop_w');
|
||||
$h = $this->arg('avatar_crop_h');
|
||||
|
||||
$filedata = $_SESSION['FILEDATA'];
|
||||
|
||||
if (!$filedata) {
|
||||
@ -328,68 +321,22 @@ class AvatarsettingsAction extends AccountSettingsAction
|
||||
return;
|
||||
}
|
||||
|
||||
$filepath = common_avatar_path($filedata['filename']);
|
||||
|
||||
if (!file_exists($filepath)) {
|
||||
$this->serverError(_('Lost our file.'));
|
||||
return;
|
||||
}
|
||||
|
||||
switch ($filedata['type']) {
|
||||
case IMAGETYPE_GIF:
|
||||
$image_src = imagecreatefromgif($filepath);
|
||||
break;
|
||||
case IMAGETYPE_JPEG:
|
||||
$image_src = imagecreatefromjpeg($filepath);
|
||||
break;
|
||||
case IMAGETYPE_PNG:
|
||||
$image_src = imagecreatefrompng($filepath);
|
||||
break;
|
||||
default:
|
||||
$this->serverError(_('Unknown file type'));
|
||||
return;
|
||||
}
|
||||
|
||||
common_debug("W = $w, H = $h, X = $x, Y = $y");
|
||||
|
||||
$image_dest = imagecreatetruecolor($w, $h);
|
||||
|
||||
$background = imagecolorallocate($image_dest, 0, 0, 0);
|
||||
ImageColorTransparent($image_dest, $background);
|
||||
imagealphablending($image_dest, false);
|
||||
|
||||
imagecopyresized($image_dest, $image_src, 0, 0, $x, $y, $w, $h, $w, $h);
|
||||
|
||||
$cur = common_current_user();
|
||||
|
||||
$filename = common_avatar_filename($cur->id,
|
||||
image_type_to_extension($filedata['type']),
|
||||
null,
|
||||
common_timestamp());
|
||||
|
||||
$filepath = common_avatar_path($filename);
|
||||
|
||||
switch ($filedata['type']) {
|
||||
case IMAGETYPE_GIF:
|
||||
imagegif($image_dest, $filepath);
|
||||
break;
|
||||
case IMAGETYPE_JPEG:
|
||||
imagejpeg($image_dest, $filepath);
|
||||
break;
|
||||
case IMAGETYPE_PNG:
|
||||
imagepng($image_dest, $filepath);
|
||||
break;
|
||||
default:
|
||||
$this->serverError(_('Unknown file type'));
|
||||
return;
|
||||
}
|
||||
// If image is not being cropped assume pos & dimentions of original
|
||||
$dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0;
|
||||
$dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0;
|
||||
$dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$filedata['width'];
|
||||
$dest_h = $this->arg('avatar_crop_h') ? $this->arg('avatar_crop_h'):$filedata['height'];
|
||||
$size = min($dest_w, $dest_h);
|
||||
$size = ($size > MAX_ORIGINAL) ? MAX_ORIGINAL:$size;
|
||||
|
||||
$user = common_current_user();
|
||||
$profile = $user->getProfile();
|
||||
|
||||
$profile = $cur->getProfile();
|
||||
$imagefile = new ImageFile($user->id, $filedata['filepath']);
|
||||
$filename = $imagefile->resize($size, $dest_x, $dest_y, $dest_w, $dest_h);
|
||||
|
||||
if ($profile->setOriginal($filepath)) {
|
||||
@unlink(common_avatar_path($filedata['filename']));
|
||||
if ($profile->setOriginal($filename)) {
|
||||
@unlink($filedata['filepath']);
|
||||
unset($_SESSION['FILEDATA']);
|
||||
$this->mode = 'upload';
|
||||
$this->showForm(_('Avatar updated.'), true);
|
||||
|
@ -350,7 +350,7 @@ class GrouplogoAction extends Action
|
||||
|
||||
$filepath = common_avatar_path($filename);
|
||||
|
||||
move_uploaded_file($imagefile->filename, $filepath);
|
||||
move_uploaded_file($imagefile->filepath, $filepath);
|
||||
|
||||
$filedata = array('filename' => $filename,
|
||||
'filepath' => $filepath,
|
||||
@ -376,9 +376,6 @@ class GrouplogoAction extends Action
|
||||
|
||||
function cropLogo()
|
||||
{
|
||||
$user = common_current_user();
|
||||
$profile = $user->getProfile();
|
||||
|
||||
$filedata = $_SESSION['FILEDATA'];
|
||||
|
||||
if (!$filedata) {
|
||||
@ -386,86 +383,19 @@ class GrouplogoAction extends Action
|
||||
return;
|
||||
}
|
||||
|
||||
$filepath = common_avatar_path($filedata['filename']);
|
||||
|
||||
if (!file_exists($filepath)) {
|
||||
$this->serverError(_('Lost our file.'));
|
||||
return;
|
||||
}
|
||||
|
||||
switch ($filedata['type']) {
|
||||
case IMAGETYPE_GIF:
|
||||
$image_src = imagecreatefromgif($filepath);
|
||||
break;
|
||||
case IMAGETYPE_JPEG:
|
||||
$image_src = imagecreatefromjpeg($filepath);
|
||||
break;
|
||||
case IMAGETYPE_PNG:
|
||||
$image_src = imagecreatefrompng($filepath);
|
||||
break;
|
||||
default:
|
||||
$this->serverError(_('Unknown file type'));
|
||||
return;
|
||||
}
|
||||
|
||||
// If image is not being cropped assume pos & dimentions of original
|
||||
$dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0;
|
||||
$dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0;
|
||||
$dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$filedata['width'];
|
||||
$dest_h = $this->arg('avatar_crop_h') ? $this->arg('avatar_crop_h'):$filedata['height'];
|
||||
$size = ($dest_w > MAX_ORIGINAL) ? MAX_ORIGINAL : $dest_w;
|
||||
$size = min($dest_w, $dest_h);
|
||||
$size = ($size > MAX_ORIGINAL) ? MAX_ORIGINAL:$size;
|
||||
|
||||
common_debug("W = $dest_w, H = $dest_h, X = $dest_x, Y = $dest_y, size = $size");
|
||||
$imagefile = new ImageFile($this->group->id, $filedata['filepath']);
|
||||
$filename = $imagefile->resize($size, $dest_x, $dest_y, $dest_w, $dest_h);
|
||||
|
||||
$image_dest = imagecreatetruecolor($size, $size);
|
||||
|
||||
if ($filedata['type'] == IMAGETYPE_GIF || $filedata['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 ($filedata['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, $dest_x, $dest_y, $size, $size, $dest_w, $dest_h);
|
||||
|
||||
$filename = common_avatar_filename($this->group->id,
|
||||
image_type_to_extension($filedata['type']),
|
||||
null,
|
||||
'group-'.common_timestamp());
|
||||
|
||||
$filepath = common_avatar_path($filename);
|
||||
|
||||
switch ($filedata['type']) {
|
||||
case IMAGETYPE_GIF:
|
||||
imagegif($image_dest, $filepath);
|
||||
break;
|
||||
case IMAGETYPE_JPEG:
|
||||
imagejpeg($image_dest, $filepath);
|
||||
break;
|
||||
case IMAGETYPE_PNG:
|
||||
imagepng($image_dest, $filepath);
|
||||
break;
|
||||
default:
|
||||
$this->serverError(_('Unknown file type'));
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->group->setOriginal($filename, $filedata['type'])) {
|
||||
@unlink(common_avatar_path($filedata['filename']));
|
||||
if ($this->group->setOriginal($filename)) {
|
||||
@unlink($filedata['filepath']);
|
||||
unset($_SESSION['FILEDATA']);
|
||||
$this->mode = 'upload';
|
||||
$this->showForm(_('Logo updated.'), true);
|
||||
|
@ -37,102 +37,6 @@ class Avatar extends Memcached_DataObject
|
||||
}
|
||||
}
|
||||
|
||||
# Create and save scaled version of this avatar
|
||||
# XXX: maybe break into different methods
|
||||
|
||||
function scale($size)
|
||||
{
|
||||
|
||||
$image_s = imagecreatetruecolor($size, $size);
|
||||
$image_a = $this->to_image();
|
||||
$square = min($this->width, $this->height);
|
||||
imagecolortransparent($image_s, imagecolorallocate($image_s, 0, 0, 0));
|
||||
imagealphablending($image_s, false);
|
||||
imagesavealpha($image_s, true);
|
||||
imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
|
||||
$size, $size, $square, $square);
|
||||
|
||||
$ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
|
||||
|
||||
$filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
|
||||
|
||||
if ($this->mediatype == 'image/jpeg') {
|
||||
imagejpeg($image_s, common_avatar_path($filename));
|
||||
} else {
|
||||
imagepng($image_s, common_avatar_path($filename));
|
||||
}
|
||||
|
||||
$scaled = DB_DataObject::factory('avatar');
|
||||
$scaled->profile_id = $this->profile_id;
|
||||
$scaled->width = $size;
|
||||
$scaled->height = $size;
|
||||
$scaled->original = false;
|
||||
$scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
|
||||
$scaled->filename = $filename;
|
||||
$scaled->url = common_avatar_url($filename);
|
||||
$scaled->created = DB_DataObject_Cast::dateTime(); # current time
|
||||
|
||||
if ($scaled->insert()) {
|
||||
return $scaled;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function scale_and_crop($size, $x, $y, $w, $h)
|
||||
{
|
||||
|
||||
$image_s = imagecreatetruecolor($size, $size);
|
||||
$image_a = $this->to_image();
|
||||
|
||||
# Retain alpha channel info if possible for .pngs
|
||||
$background = imagecolorallocate($image_s, 0, 0, 0);
|
||||
ImageColorTransparent($image_s, $background);
|
||||
imagealphablending($image_s, false);
|
||||
|
||||
imagecopyresized($image_s, $image_a, 0, 0, $x, $y, $size, $size, $w, $h);
|
||||
|
||||
$ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
|
||||
|
||||
$filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
|
||||
|
||||
if ($this->mediatype == 'image/jpeg') {
|
||||
imagejpeg($image_s, common_avatar_path($filename));
|
||||
} else {
|
||||
imagepng($image_s, common_avatar_path($filename));
|
||||
}
|
||||
|
||||
$cropped = DB_DataObject::factory('avatar');
|
||||
$cropped->profile_id = $this->profile_id;
|
||||
$cropped->width = $size;
|
||||
$cropped->height = $size;
|
||||
$cropped->original = false;
|
||||
$cropped->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
|
||||
$cropped->filename = $filename;
|
||||
$cropped->url = common_avatar_url($filename);
|
||||
$cropped->created = DB_DataObject_Cast::dateTime(); # current time
|
||||
|
||||
if ($cropped->insert()) {
|
||||
return $cropped;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
function to_image()
|
||||
{
|
||||
$filepath = common_avatar_path($this->filename);
|
||||
if ($this->mediatype == 'image/gif') {
|
||||
return imagecreatefromgif($filepath);
|
||||
} else if ($this->mediatype == 'image/jpeg') {
|
||||
return imagecreatefromjpeg($filepath);
|
||||
} else if ($this->mediatype == 'image/png') {
|
||||
return imagecreatefrompng($filepath);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
function &pkeyGet($kv)
|
||||
{
|
||||
return Memcached_DataObject::pkeyGet('Avatar', $kv);
|
||||
|
@ -69,28 +69,15 @@ class Profile extends Memcached_DataObject
|
||||
}
|
||||
}
|
||||
|
||||
function setOriginal($source)
|
||||
function setOriginal($filename)
|
||||
{
|
||||
|
||||
$info = @getimagesize($source);
|
||||
|
||||
if (!$info) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$filename = common_avatar_filename($this->id,
|
||||
image_type_to_extension($info[2]),
|
||||
null, common_timestamp());
|
||||
$filepath = common_avatar_path($filename);
|
||||
|
||||
copy($source, $filepath);
|
||||
$imagefile = new ImageFile($this->id, common_avatar_path($filename));
|
||||
|
||||
$avatar = new Avatar();
|
||||
|
||||
$avatar->profile_id = $this->id;
|
||||
$avatar->width = $info[0];
|
||||
$avatar->height = $info[1];
|
||||
$avatar->mediatype = image_type_to_mime_type($info[2]);
|
||||
$avatar->width = $imagefile->width;
|
||||
$avatar->height = $imagefile->height;
|
||||
$avatar->mediatype = image_type_to_mime_type($imagefile->type);
|
||||
$avatar->filename = $filename;
|
||||
$avatar->original = true;
|
||||
$avatar->url = common_avatar_url($filename);
|
||||
@ -98,21 +85,29 @@ class Profile extends Memcached_DataObject
|
||||
|
||||
# XXX: start a transaction here
|
||||
|
||||
if (!$this->delete_avatars()) {
|
||||
@unlink($filepath);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!$avatar->insert()) {
|
||||
@unlink($filepath);
|
||||
if (!$this->delete_avatars() || !$avatar->insert()) {
|
||||
@unlink(common_avatar_path($filename));
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
|
||||
# We don't do a scaled one if original is our scaled size
|
||||
if (!($avatar->width == $size && $avatar->height == $size)) {
|
||||
$s = $avatar->scale($size);
|
||||
if (!$s) {
|
||||
|
||||
$scaled_filename = $imagefile->resize($size);
|
||||
|
||||
//$scaled = DB_DataObject::factory('avatar');
|
||||
$scaled = new Avatar();
|
||||
$scaled->profile_id = $this->id;
|
||||
$scaled->width = $size;
|
||||
$scaled->height = $size;
|
||||
$scaled->original = false;
|
||||
$scaled->mediatype = image_type_to_mime_type($imagefile->type);
|
||||
$scaled->filename = $scaled_filename;
|
||||
$scaled->url = common_avatar_url($scaled_filename);
|
||||
$scaled->created = DB_DataObject_Cast::dateTime(); # current time
|
||||
|
||||
if (!$scaled->insert()) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -121,24 +116,6 @@ class Profile extends Memcached_DataObject
|
||||
return $avatar;
|
||||
}
|
||||
|
||||
function crop_avatars($x, $y, $w, $h)
|
||||
{
|
||||
|
||||
$avatar = $this->getOriginalAvatar();
|
||||
$this->delete_avatars(false); # don't delete original
|
||||
|
||||
foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
|
||||
# We don't do a scaled one if original is our scaled size
|
||||
if (!($avatar->width == $size && $avatar->height == $size)) {
|
||||
$s = $avatar->scale_and_crop($size, $x, $y, $w, $h);
|
||||
if (!$s) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function delete_avatars($original=true)
|
||||
{
|
||||
$avatar = new Avatar();
|
||||
|
@ -88,96 +88,16 @@ class User_group extends Memcached_DataObject
|
||||
return $members;
|
||||
}
|
||||
|
||||
function setOriginal($filename, $type)
|
||||
function setOriginal($filename)
|
||||
{
|
||||
$imagefile = new ImageFile($this->id, common_avatar_path($filename));
|
||||
|
||||
$orig = clone($this);
|
||||
$this->original_logo = common_avatar_url($filename);
|
||||
$this->homepage_logo = common_avatar_url($this->scale($filename,
|
||||
AVATAR_PROFILE_SIZE,
|
||||
$type));
|
||||
$this->stream_logo = common_avatar_url($this->scale($filename,
|
||||
AVATAR_STREAM_SIZE,
|
||||
$type));
|
||||
$this->mini_logo = common_avatar_url($this->scale($filename,
|
||||
AVATAR_MINI_SIZE,
|
||||
$type));
|
||||
$this->homepage_logo = common_avatar_url($imagefile->resize(AVATAR_PROFILE_SIZE));
|
||||
$this->stream_logo = common_avatar_url($imagefile->resize(AVATAR_STREAM_SIZE));
|
||||
$this->mini_logo = common_avatar_url($imagefile->resize(AVATAR_MINI_SIZE));
|
||||
common_debug(common_log_objstring($this));
|
||||
return $this->update($orig);
|
||||
}
|
||||
|
||||
function scale($filename, $size, $type)
|
||||
{
|
||||
$filepath = common_avatar_path($filename);
|
||||
|
||||
if (!file_exists($filepath)) {
|
||||
$this->serverError(_('Lost our file.'));
|
||||
return;
|
||||
}
|
||||
|
||||
$info = @getimagesize($filepath);
|
||||
|
||||
switch ($type) {
|
||||
case IMAGETYPE_GIF:
|
||||
$image_src = imagecreatefromgif($filepath);
|
||||
break;
|
||||
case IMAGETYPE_JPEG:
|
||||
$image_src = imagecreatefromjpeg($filepath);
|
||||
break;
|
||||
case IMAGETYPE_PNG:
|
||||
$image_src = imagecreatefrompng($filepath);
|
||||
break;
|
||||
default:
|
||||
$this->serverError(_('Unknown file type'));
|
||||
return;
|
||||
}
|
||||
|
||||
$image_dest = imagecreatetruecolor($size, $size);
|
||||
|
||||
if ($type == IMAGETYPE_GIF || $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 ($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, 0, 0, $size, $size, $info[0], $info[1]);
|
||||
|
||||
$outname = common_avatar_filename($this->id,
|
||||
image_type_to_extension($type),
|
||||
$size,
|
||||
common_timestamp());
|
||||
|
||||
$outpath = common_avatar_path($outname);
|
||||
|
||||
switch ($type) {
|
||||
case IMAGETYPE_GIF:
|
||||
imagegif($image_dest, $outpath);
|
||||
break;
|
||||
case IMAGETYPE_JPEG:
|
||||
imagejpeg($image_dest, $outpath);
|
||||
break;
|
||||
case IMAGETYPE_PNG:
|
||||
imagepng($image_dest, $outpath);
|
||||
break;
|
||||
default:
|
||||
$this->serverError(_('Unknown file type'));
|
||||
return;
|
||||
}
|
||||
|
||||
return $outname;
|
||||
}
|
||||
}
|
||||
|
@ -47,18 +47,22 @@ if (!defined('LACONICA')) {
|
||||
|
||||
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')
|
||||
@ -79,31 +83,99 @@ class ImageFile
|
||||
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;
|
||||
}
|
||||
|
||||
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 = common_avatar_filename($this->id,
|
||||
image_type_to_extension($this->type),
|
||||
$size,
|
||||
common_timestamp());
|
||||
|
||||
$outpath = common_avatar_path($outname);
|
||||
|
||||
switch ($this->type) {
|
||||
case IMAGETYPE_GIF:
|
||||
imagegif($image_dest, $outpath);
|
||||
break;
|
||||
case IMAGETYPE_JPEG:
|
||||
imagejpeg($image_dest, $outpath);
|
||||
break;
|
||||
case IMAGETYPE_PNG:
|
||||
imagepng($image_dest, $outpath);
|
||||
break;
|
||||
default:
|
||||
throw new Exception(_('Unknown file type'));
|
||||
return;
|
||||
}
|
||||
|
||||
return $outname;
|
||||
}
|
||||
|
||||
function unlink()
|
||||
|
Loading…
Reference in New Issue
Block a user