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';
|
require_once INSTALLDIR.'/lib/accountsettingsaction.php';
|
||||||
|
|
||||||
|
define('MAX_ORIGINAL', 480);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Upload an avatar
|
* Upload an avatar
|
||||||
*
|
*
|
||||||
@ -286,7 +288,7 @@ class AvatarsettingsAction extends AccountSettingsAction
|
|||||||
|
|
||||||
$filepath = common_avatar_path($filename);
|
$filepath = common_avatar_path($filename);
|
||||||
|
|
||||||
move_uploaded_file($imagefile->filename, $filepath);
|
move_uploaded_file($imagefile->filepath, $filepath);
|
||||||
|
|
||||||
$filedata = array('filename' => $filename,
|
$filedata = array('filename' => $filename,
|
||||||
'filepath' => $filepath,
|
'filepath' => $filepath,
|
||||||
@ -312,15 +314,6 @@ class AvatarsettingsAction extends AccountSettingsAction
|
|||||||
|
|
||||||
function cropAvatar()
|
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'];
|
$filedata = $_SESSION['FILEDATA'];
|
||||||
|
|
||||||
if (!$filedata) {
|
if (!$filedata) {
|
||||||
@ -328,68 +321,22 @@ class AvatarsettingsAction extends AccountSettingsAction
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$filepath = common_avatar_path($filedata['filename']);
|
// If image is not being cropped assume pos & dimentions of original
|
||||||
|
$dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0;
|
||||||
if (!file_exists($filepath)) {
|
$dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0;
|
||||||
$this->serverError(_('Lost our file.'));
|
$dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$filedata['width'];
|
||||||
return;
|
$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;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
$user = common_current_user();
|
$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)) {
|
if ($profile->setOriginal($filename)) {
|
||||||
@unlink(common_avatar_path($filedata['filename']));
|
@unlink($filedata['filepath']);
|
||||||
unset($_SESSION['FILEDATA']);
|
unset($_SESSION['FILEDATA']);
|
||||||
$this->mode = 'upload';
|
$this->mode = 'upload';
|
||||||
$this->showForm(_('Avatar updated.'), true);
|
$this->showForm(_('Avatar updated.'), true);
|
||||||
|
@ -350,7 +350,7 @@ class GrouplogoAction extends Action
|
|||||||
|
|
||||||
$filepath = common_avatar_path($filename);
|
$filepath = common_avatar_path($filename);
|
||||||
|
|
||||||
move_uploaded_file($imagefile->filename, $filepath);
|
move_uploaded_file($imagefile->filepath, $filepath);
|
||||||
|
|
||||||
$filedata = array('filename' => $filename,
|
$filedata = array('filename' => $filename,
|
||||||
'filepath' => $filepath,
|
'filepath' => $filepath,
|
||||||
@ -376,9 +376,6 @@ class GrouplogoAction extends Action
|
|||||||
|
|
||||||
function cropLogo()
|
function cropLogo()
|
||||||
{
|
{
|
||||||
$user = common_current_user();
|
|
||||||
$profile = $user->getProfile();
|
|
||||||
|
|
||||||
$filedata = $_SESSION['FILEDATA'];
|
$filedata = $_SESSION['FILEDATA'];
|
||||||
|
|
||||||
if (!$filedata) {
|
if (!$filedata) {
|
||||||
@ -386,86 +383,19 @@ class GrouplogoAction extends Action
|
|||||||
return;
|
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
|
// 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_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_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_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'];
|
$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 ($this->group->setOriginal($filename)) {
|
||||||
|
@unlink($filedata['filepath']);
|
||||||
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']));
|
|
||||||
unset($_SESSION['FILEDATA']);
|
unset($_SESSION['FILEDATA']);
|
||||||
$this->mode = 'upload';
|
$this->mode = 'upload';
|
||||||
$this->showForm(_('Logo updated.'), true);
|
$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)
|
function &pkeyGet($kv)
|
||||||
{
|
{
|
||||||
return Memcached_DataObject::pkeyGet('Avatar', $kv);
|
return Memcached_DataObject::pkeyGet('Avatar', $kv);
|
||||||
|
@ -69,28 +69,15 @@ class Profile extends Memcached_DataObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setOriginal($source)
|
function setOriginal($filename)
|
||||||
{
|
{
|
||||||
|
$imagefile = new ImageFile($this->id, common_avatar_path($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);
|
|
||||||
|
|
||||||
$avatar = new Avatar();
|
$avatar = new Avatar();
|
||||||
|
|
||||||
$avatar->profile_id = $this->id;
|
$avatar->profile_id = $this->id;
|
||||||
$avatar->width = $info[0];
|
$avatar->width = $imagefile->width;
|
||||||
$avatar->height = $info[1];
|
$avatar->height = $imagefile->height;
|
||||||
$avatar->mediatype = image_type_to_mime_type($info[2]);
|
$avatar->mediatype = image_type_to_mime_type($imagefile->type);
|
||||||
$avatar->filename = $filename;
|
$avatar->filename = $filename;
|
||||||
$avatar->original = true;
|
$avatar->original = true;
|
||||||
$avatar->url = common_avatar_url($filename);
|
$avatar->url = common_avatar_url($filename);
|
||||||
@ -98,21 +85,29 @@ class Profile extends Memcached_DataObject
|
|||||||
|
|
||||||
# XXX: start a transaction here
|
# XXX: start a transaction here
|
||||||
|
|
||||||
if (!$this->delete_avatars()) {
|
if (!$this->delete_avatars() || !$avatar->insert()) {
|
||||||
@unlink($filepath);
|
@unlink(common_avatar_path($filename));
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$avatar->insert()) {
|
|
||||||
@unlink($filepath);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
|
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
|
# We don't do a scaled one if original is our scaled size
|
||||||
if (!($avatar->width == $size && $avatar->height == $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;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -121,24 +116,6 @@ class Profile extends Memcached_DataObject
|
|||||||
return $avatar;
|
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)
|
function delete_avatars($original=true)
|
||||||
{
|
{
|
||||||
$avatar = new Avatar();
|
$avatar = new Avatar();
|
||||||
|
@ -88,96 +88,16 @@ class User_group extends Memcached_DataObject
|
|||||||
return $members;
|
return $members;
|
||||||
}
|
}
|
||||||
|
|
||||||
function setOriginal($filename, $type)
|
function setOriginal($filename)
|
||||||
{
|
{
|
||||||
|
$imagefile = new ImageFile($this->id, common_avatar_path($filename));
|
||||||
|
|
||||||
$orig = clone($this);
|
$orig = clone($this);
|
||||||
$this->original_logo = common_avatar_url($filename);
|
$this->original_logo = common_avatar_url($filename);
|
||||||
$this->homepage_logo = common_avatar_url($this->scale($filename,
|
$this->homepage_logo = common_avatar_url($imagefile->resize(AVATAR_PROFILE_SIZE));
|
||||||
AVATAR_PROFILE_SIZE,
|
$this->stream_logo = common_avatar_url($imagefile->resize(AVATAR_STREAM_SIZE));
|
||||||
$type));
|
$this->mini_logo = common_avatar_url($imagefile->resize(AVATAR_MINI_SIZE));
|
||||||
$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));
|
|
||||||
common_debug(common_log_objstring($this));
|
common_debug(common_log_objstring($this));
|
||||||
return $this->update($orig);
|
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
|
class ImageFile
|
||||||
{
|
{
|
||||||
var $filename = null;
|
var $id;
|
||||||
var $barename = null;
|
var $filepath;
|
||||||
var $type = null;
|
var $barename;
|
||||||
var $height = null;
|
var $type;
|
||||||
var $width = null;
|
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->id = $id;
|
||||||
$this->type = $type;
|
$this->filepath = $filepath;
|
||||||
$this->width = $type;
|
|
||||||
$this->height = $type;
|
$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')
|
static function fromUpload($param='upload')
|
||||||
@ -79,31 +83,99 @@ class ImageFile
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$imagefile = new ImageFile($_FILES[$param]['tmp_name']);
|
$info = @getimagesize($_FILES[$param]['tmp_name']);
|
||||||
$info = @getimagesize($imagefile->filename);
|
|
||||||
|
|
||||||
if (!$info) {
|
if (!$info) {
|
||||||
@unlink($imagefile->filename);
|
@unlink($_FILES[$param]['tmp_name']);
|
||||||
throw new Exception(_('Not an image or corrupt file.'));
|
throw new Exception(_('Not an image or corrupt file.'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$imagefile->width = $info[0];
|
if ($info[2] !== IMAGETYPE_GIF &&
|
||||||
$imagefile->height = $info[1];
|
$info[2] !== IMAGETYPE_JPEG &&
|
||||||
|
$info[2] !== IMAGETYPE_PNG) {
|
||||||
|
|
||||||
switch ($info[2]) {
|
@unlink($_FILES[$param]['tmp_name']);
|
||||||
case IMAGETYPE_GIF:
|
|
||||||
case IMAGETYPE_JPEG:
|
|
||||||
case IMAGETYPE_PNG:
|
|
||||||
$imagefile->type = $info[2];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
@unlink($imagefile->filename);
|
|
||||||
throw new Exception(_('Unsupported image file format.'));
|
throw new Exception(_('Unsupported image file format.'));
|
||||||
return;
|
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()
|
function unlink()
|
||||||
|
Loading…
Reference in New Issue
Block a user