Add support for PNG images with alpha

This commit is contained in:
Fabio Comuni 2012-06-07 17:42:13 +02:00
parent 1d832618a4
commit 7cc8c369cb
11 changed files with 215 additions and 70 deletions

View File

@ -11,7 +11,7 @@ require_once('include/cache.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '3.0.1366' ); define ( 'FRIENDICA_VERSION', '3.0.1366' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1148 ); define ( 'DB_UPDATE_VERSION', 1149 );
define ( 'EOL', "<br />\r\n" ); define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@ -28,6 +28,11 @@ define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
*/ */
define ( 'JPEG_QUALITY', 100 ); define ( 'JPEG_QUALITY', 100 );
/**
* $a->config['system']['png_quality'] from 0 (uncompressed) to 9
*/
define ( 'PNG_QUALITY', 8 );
/** /**
* Not yet used * Not yet used

View File

@ -7,14 +7,34 @@ class Photo {
private $width; private $width;
private $height; private $height;
private $valid; private $valid;
private $type;
private $types;
public function __construct($data) { /**
* supported mimetypes and corresponding file extensions
*/
static function supportedTypes() {
$t = array();
$t['image/jpeg'] ='jpg';
if (imagetypes() & IMG_PNG) $t['image/png'] = 'png';
return $t;
}
public function __construct($data, $type="image/jpeg") {
$this->types = $this->supportedTypes();
if (!array_key_exists($type,$this->types)){
$type='image/jpeg';
}
$this->valid = false; $this->valid = false;
$this->type = $type;
$this->image = @imagecreatefromstring($data); $this->image = @imagecreatefromstring($data);
if($this->image !== FALSE) { if($this->image !== FALSE) {
$this->width = imagesx($this->image); $this->width = imagesx($this->image);
$this->height = imagesy($this->image); $this->height = imagesy($this->image);
$this->valid = true; $this->valid = true;
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
} }
} }
@ -38,6 +58,13 @@ class Photo {
public function getImage() { public function getImage() {
return $this->image; return $this->image;
} }
public function getType() {
return $this->type;
}
public function getExt() {
return $this->types[$this->type];
}
public function scaleImage($max) { public function scaleImage($max) {
@ -78,6 +105,9 @@ class Photo {
$dest = imagecreatetruecolor( $dest_width, $dest_height ); $dest = imagecreatetruecolor( $dest_width, $dest_height );
imagealphablending($dest->image, false);
imagesavealpha($dest, true);
if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127));; // fill with alpha
imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height); imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
if($this->image) if($this->image)
imagedestroy($this->image); imagedestroy($this->image);
@ -134,6 +164,9 @@ class Photo {
$dest = imagecreatetruecolor( $dest_width, $dest_height ); $dest = imagecreatetruecolor( $dest_width, $dest_height );
imagealphablending($dest->image, false);
imagesavealpha($dest, true);
if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127));; // fill with alpha
imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height); imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
if($this->image) if($this->image)
imagedestroy($this->image); imagedestroy($this->image);
@ -148,6 +181,9 @@ class Photo {
public function scaleImageSquare($dim) { public function scaleImageSquare($dim) {
$dest = imagecreatetruecolor( $dim, $dim ); $dest = imagecreatetruecolor( $dim, $dim );
imagealphablending($dest->image, false);
imagesavealpha($dest, true);
if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127));; // fill with alpha
imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dim, $dim, $this->width, $this->height); imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dim, $dim, $this->width, $this->height);
if($this->image) if($this->image)
imagedestroy($this->image); imagedestroy($this->image);
@ -159,6 +195,9 @@ class Photo {
public function cropImage($max,$x,$y,$w,$h) { public function cropImage($max,$x,$y,$w,$h) {
$dest = imagecreatetruecolor( $max, $max ); $dest = imagecreatetruecolor( $max, $max );
imagealphablending($dest->image, false);
imagesavealpha($dest, true);
if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127));; // fill with alpha
imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $max, $max, $w, $h); imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $max, $max, $w, $h);
if($this->image) if($this->image)
imagedestroy($this->image); imagedestroy($this->image);
@ -168,20 +207,38 @@ class Photo {
} }
public function saveImage($path) { public function saveImage($path) {
$quality = get_config('system','jpeg_quality'); switch($this->type){
if((! $quality) || ($quality > 100)) case "image/png":
$quality = JPEG_QUALITY; $quality = get_config('system','png_quality');
imagejpeg($this->image,$path,$quality); if((! $quality) || ($quality > 9))
$quality = PNG_QUALITY;
imagepng($this->image, $path, $quality);
break;
default:
$quality = get_config('system','jpeg_quality');
if((! $quality) || ($quality > 100))
$quality = JPEG_QUALITY;
imagejpeg($this->image,$path,$quality);
}
} }
public function imageString() { public function imageString() {
ob_start(); ob_start();
switch($this->type){
case "image/png":
$quality = get_config('system','png_quality');
if((! $quality) || ($quality > 9))
$quality = PNG_QUALITY;
imagepng($this->image,NULL, $quality);
break;
default:
$quality = get_config('system','jpeg_quality');
if((! $quality) || ($quality > 100))
$quality = JPEG_QUALITY;
$quality = get_config('system','jpeg_quality'); imagejpeg($this->image,NULL,$quality);
if((! $quality) || ($quality > 100)) }
$quality = JPEG_QUALITY;
imagejpeg($this->image,NULL,$quality);
$s = ob_get_contents(); $s = ob_get_contents();
ob_end_clean(); ob_end_clean();
return $s; return $s;
@ -200,8 +257,8 @@ class Photo {
$guid = get_guid(); $guid = get_guid();
$r = q("INSERT INTO `photo` $r = q("INSERT INTO `photo`
( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` ) ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )", VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
intval($uid), intval($uid),
intval($cid), intval($cid),
dbesc($guid), dbesc($guid),
@ -209,6 +266,7 @@ class Photo {
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc(basename($filename)), dbesc(basename($filename)),
dbesc($this->type),
dbesc($album), dbesc($album),
intval($this->height), intval($this->height),
intval($this->width), intval($this->width),
@ -230,6 +288,38 @@ class Photo {
}} }}
/**
* Guess image mimetype from filename or from Content-Type header
*
* @arg $filename string Image filename
* @arg $fromcurl boolean Check Content-Type header from curl request
*/
function guess_image_type($filename, $fromcurl=false) {
$type = null;
if ($fromcurl) {
$a = get_app();
$headers=array();
$h = explode("\n",$a->get_curl_headers());
foreach ($h as $l) {
list($k,$v) = array_map("trim", explode(":", trim($l), 2));
$headers[$k] = $v;
}
if (array_key_exists('Content-Type', $headers))
$type = $headers['Content-Type'];
}
if (is_null($type)){
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$types = Photo::supportedTypes();
foreach ($types as $m=>$e){
if ($ext==$e) return $m;
}
$type = "image/jpeg";
}
return $type;
}
function import_profile_photo($photo,$uid,$cid) { function import_profile_photo($photo,$uid,$cid) {
$a = get_app(); $a = get_app();
@ -238,7 +328,12 @@ function import_profile_photo($photo,$uid,$cid) {
$filename = basename($photo); $filename = basename($photo);
$img_str = fetch_url($photo,true); $img_str = fetch_url($photo,true);
$img = new Photo($img_str);
// guess mimetype from headers or filename
$type = guess_image_type($photo,true);
$img = new Photo($img_str, $type);
if($img->is_valid()) { if($img->is_valid()) {
$img->scaleImageSquare(175); $img->scaleImageSquare(175);
@ -266,9 +361,9 @@ function import_profile_photo($photo,$uid,$cid) {
$photo = $a->get_baseurl() . '/photo/' . $hash . '-4.jpg'; $photo = $a->get_baseurl() . '/photo/' . $hash . '-4.' . $img->getExt();
$thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.jpg'; $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.' . $img->getExt();
$micro = $a->get_baseurl() . '/photo/' . $hash . '-6.jpg'; $micro = $a->get_baseurl() . '/photo/' . $hash . '-6.' . $img->getExt();
} }
else else
$photo_failure = true; $photo_failure = true;

View File

@ -1346,7 +1346,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
} }
$img_str = fetch_url($photo_url,true); $img_str = fetch_url($photo_url,true);
$img = new Photo($img_str); // guess mimetype from headers or filename
$type = guess_image_type($photo_url,true);
$img = new Photo($img_str, $type);
if($img->is_valid()) { if($img->is_valid()) {
if($have_photo) { if($have_photo) {
q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `contact-id` = %d AND `uid` = %d", q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `contact-id` = %d AND `uid` = %d",
@ -1372,9 +1376,9 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
q("UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s' q("UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
WHERE `uid` = %d AND `id` = %d LIMIT 1", WHERE `uid` = %d AND `id` = %d LIMIT 1",
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.jpg'), dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.jpg'), dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.jpg'), dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
intval($contact['uid']), intval($contact['uid']),
intval($contact['id']) intval($contact['id'])
); );

View File

@ -807,8 +807,11 @@ function scale_external_images($s,$include_link = true) {
if(stristr($mtch[1],$hostname)) if(stristr($mtch[1],$hostname))
continue; continue;
$i = fetch_url($mtch[1]); $i = fetch_url($mtch[1]);
// guess mimetype from headers or filename
$type = guess_image_type($mtch[1],true);
if($i) { if($i) {
$ph = new Photo($i); $ph = new Photo($i, $type);
if($ph->is_valid()) { if($ph->is_valid()) {
$orig_width = $ph->getWidth(); $orig_width = $ph->getWidth();
$orig_height = $ph->getHeight(); $orig_height = $ph->getHeight();

View File

@ -284,7 +284,11 @@ function create_user($arr) {
$filename = basename($photo); $filename = basename($photo);
$img_str = fetch_url($photo,true); $img_str = fetch_url($photo,true);
$img = new Photo($img_str); // guess mimetype from headers or filename
$type = guess_image_type($photo,true);
$img = new Photo($img_str, $type);
if($img->is_valid()) { if($img->is_valid()) {
$img->scaleImageSquare(175); $img->scaleImageSquare(175);
@ -324,4 +328,4 @@ function create_user($arr) {
$result['user'] = $u; $result['user'] = $u;
return $result; return $result;
} }

View File

@ -215,8 +215,11 @@ function parse_url_content(&$a) {
$i = fetch_url($image); $i = fetch_url($image);
if($i) { if($i) {
// guess mimetype from headers or filename
$type = guess_image_type($image,true);
require_once('include/Photo.php'); require_once('include/Photo.php');
$ph = new Photo($i); $ph = new Photo($i, $type);
if($ph->is_valid()) { if($ph->is_valid()) {
if($ph->getWidth() > 300 || $ph->getHeight() > 300) { if($ph->getWidth() > 300 || $ph->getHeight() > 300) {
$ph->scaleImage(300); $ph->scaleImage(300);

View File

@ -1,6 +1,7 @@
<?php <?php
require_once('include/security.php'); require_once('include/security.php');
require_once('include/Photo.php');
function photo_init(&$a) { function photo_init(&$a) {
@ -83,9 +84,11 @@ function photo_init(&$a) {
); );
if(count($r)) { if(count($r)) {
$data = $r[0]['data']; $data = $r[0]['data'];
$mimetype = $r[0]['type'];
} }
if(! isset($data)) { if(! isset($data)) {
$data = file_get_contents($default); $data = file_get_contents($default);
$mimetype = 'image/jpeg';
} }
} }
else { else {
@ -95,7 +98,9 @@ function photo_init(&$a) {
*/ */
$resolution = 0; $resolution = 0;
$photo = str_replace('.jpg','',$photo); foreach( Photo::supportedTypes() as $m=>$e){
$photo = str_replace(".$e",'',$photo);
}
if(substr($photo,-2,1) == '-') { if(substr($photo,-2,1) == '-') {
$resolution = intval(substr($photo,-1,1)); $resolution = intval(substr($photo,-1,1));
@ -119,6 +124,7 @@ function photo_init(&$a) {
if(count($r)) { if(count($r)) {
$data = $r[0]['data']; $data = $r[0]['data'];
$mimetype = $r[0]['type'];
} }
else { else {
@ -136,6 +142,7 @@ function photo_init(&$a) {
); );
if(count($r)) { if(count($r)) {
$data = file_get_contents('images/nosign.jpg'); $data = file_get_contents('images/nosign.jpg');
$mimetype = 'image/jpeg';
$prvcachecontrol = true; $prvcachecontrol = true;
} }
} }
@ -148,12 +155,15 @@ function photo_init(&$a) {
case 4: case 4:
$data = file_get_contents('images/person-175.jpg'); $data = file_get_contents('images/person-175.jpg');
$mimetype = 'image/jpeg';
break; break;
case 5: case 5:
$data = file_get_contents('images/person-80.jpg'); $data = file_get_contents('images/person-80.jpg');
$mimetype = 'image/jpeg';
break; break;
case 6: case 6:
$data = file_get_contents('images/person-48.jpg'); $data = file_get_contents('images/person-48.jpg');
$mimetype = 'image/jpeg';
break; break;
default: default:
killme(); killme();
@ -164,11 +174,11 @@ function photo_init(&$a) {
} }
if(isset($customres) && $customres > 0 && $customres < 500) { if(isset($customres) && $customres > 0 && $customres < 500) {
require_once('include/Photo.php'); $ph = new Photo($data, $mimetype);
$ph = new Photo($data);
if($ph->is_valid()) { if($ph->is_valid()) {
$ph->scaleImageSquare($customres); $ph->scaleImageSquare($customres);
$data = $ph->imageString(); $data = $ph->imageString();
$mimetype = $ph->getType();
} }
} }
@ -181,7 +191,7 @@ function photo_init(&$a) {
header_remove('pragma'); header_remove('pragma');
} }
header("Content-type: image/jpeg"); header("Content-type: ".$mimetype);
if($prvcachecontrol) { if($prvcachecontrol) {

View File

@ -5,6 +5,7 @@ require_once('include/acl_selectors.php');
require_once('include/bbcode.php'); require_once('include/bbcode.php');
require_once('include/security.php'); require_once('include/security.php');
function photos_init(&$a) { function photos_init(&$a) {
@ -105,6 +106,8 @@ function photos_post(&$a) {
logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA); logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA); logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA);
$phototypes = Photo::supportedTypes();
$can_post = false; $can_post = false;
$visitor = 0; $visitor = 0;
@ -311,7 +314,7 @@ function photos_post(&$a) {
intval($page_owner_uid) intval($page_owner_uid)
); );
if(count($r)) { if(count($r)) {
$ph = new Photo($r[0]['data']); $ph = new Photo($r[0]['data'], $r[0]['type']);
if($ph->is_valid()) { if($ph->is_valid()) {
$ph->rotate(270); $ph->rotate(270);
@ -362,6 +365,7 @@ function photos_post(&$a) {
intval($page_owner_uid) intval($page_owner_uid)
); );
if(count($p)) { if(count($p)) {
$ext = $phototypes[$p[0]['type']];
$r = q("UPDATE `photo` SET `desc` = '%s', `album` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource-id` = '%s' AND `uid` = %d", $r = q("UPDATE `photo` SET `desc` = '%s', `album` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource-id` = '%s' AND `uid` = %d",
dbesc($desc), dbesc($desc),
dbesc($albname), dbesc($albname),
@ -386,7 +390,7 @@ function photos_post(&$a) {
$title = ''; $title = '';
$uri = item_new_uri($a->get_hostname(),$page_owner_uid); $uri = item_new_uri($a->get_hostname(),$page_owner_uid);
$arr = array(); $arr = array();
$arr['uid'] = $page_owner_uid; $arr['uid'] = $page_owner_uid;
@ -412,7 +416,7 @@ function photos_post(&$a) {
$arr['origin'] = 1; $arr['origin'] = 1;
$arr['body'] = '[url=' . $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $p[0]['resource-id'] . ']' $arr['body'] = '[url=' . $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $p[0]['resource-id'] . ']'
. '[img]' . $a->get_baseurl() . '/photo/' . $p[0]['resource-id'] . '-' . $p[0]['scale'] . '.jpg' . '[/img]' . '[img]' . $a->get_baseurl() . '/photo/' . $p[0]['resource-id'] . '-' . $p[0]['scale'] . '.'. $ext . '[/img]'
. '[/url]'; . '[/url]';
$item_id = item_store($arr); $item_id = item_store($arr);
@ -581,17 +585,17 @@ function photos_post(&$a) {
$arr['inform'] = $tagged[2]; $arr['inform'] = $tagged[2];
$arr['origin'] = 1; $arr['origin'] = 1;
$arr['body'] = '[url=' . $tagged[1] . ']' . $tagged[0] . '[/url]' . ' ' . t('was tagged in a') . ' ' . '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . ']' . t('photo') . '[/url]' . ' ' . t('by') . ' ' . '[url=' . $owner_record['url'] . ']' . $owner_record['name'] . '[/url]' ; $arr['body'] = '[url=' . $tagged[1] . ']' . $tagged[0] . '[/url]' . ' ' . t('was tagged in a') . ' ' . '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . ']' . t('photo') . '[/url]' . ' ' . t('by') . ' ' . '[url=' . $owner_record['url'] . ']' . $owner_record['name'] . '[/url]' ;
$arr['body'] .= "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . ']' . '[img]' . $a->get_baseurl() . "/photo/" . $p[0]['resource-id'] . '-' . $best . '.jpg' . '[/img][/url]' . "\n" ; $arr['body'] .= "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . ']' . '[img]' . $a->get_baseurl() . "/photo/" . $p[0]['resource-id'] . '-' . $best . '.' . $ext . '[/img][/url]' . "\n" ;
$arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $tagged[0] . '</title><id>' . $tagged[1] . '/' . $tagged[0] . '</id>'; $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $tagged[0] . '</title><id>' . $tagged[1] . '/' . $tagged[0] . '</id>';
$arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $tagged[1] . '" />' . "\n"); $arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $tagged[1] . '" />' . "\n");
if($tagged[3]) if($tagged[3])
$arr['object'] .= xmlify('<link rel="photo" type="image/jpeg" href="' . $tagged[3]['photo'] . '" />' . "\n"); $arr['object'] .= xmlify('<link rel="photo" type="'.$p[0]['type'].'" href="' . $tagged[3]['photo'] . '" />' . "\n");
$arr['object'] .= '</link></object>' . "\n"; $arr['object'] .= '</link></object>' . "\n";
$arr['target'] = '<target><type>' . ACTIVITY_OBJ_PHOTO . '</type><title>' . $p[0]['desc'] . '</title><id>' $arr['target'] = '<target><type>' . ACTIVITY_OBJ_PHOTO . '</type><title>' . $p[0]['desc'] . '</title><id>'
. $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . '</id>'; . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . '</id>';
$arr['target'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . '" />' . "\n" . '<link rel="preview" type="image/jpeg" href="' . $a->get_baseurl() . "/photo/" . $p[0]['resource-id'] . '-' . $best . '.jpg' . '" />') . '</link></target>'; $arr['target'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . '" />' . "\n" . '<link rel="preview" type="'.$p[0]['type'].'" href="' . $a->get_baseurl() . "/photo/" . $p[0]['resource-id'] . '-' . $best . '.' . $ext . '" />') . '</link></target>';
$item_id = item_store($arr); $item_id = item_store($arr);
if($item_id) { if($item_id) {
@ -662,7 +666,7 @@ function photos_post(&$a) {
$str_group_deny = perms2str(((is_array($_REQUEST['group_deny'])) ? $_REQUEST['group_deny'] : explode(',',$_REQUEST['group_deny']))); $str_group_deny = perms2str(((is_array($_REQUEST['group_deny'])) ? $_REQUEST['group_deny'] : explode(',',$_REQUEST['group_deny'])));
$str_contact_deny = perms2str(((is_array($_REQUEST['contact_deny'])) ? $_REQUEST['contact_deny'] : explode(',',$_REQUEST['contact_deny']))); $str_contact_deny = perms2str(((is_array($_REQUEST['contact_deny'])) ? $_REQUEST['contact_deny'] : explode(',',$_REQUEST['contact_deny'])));
$ret = array('src' => '', 'filename' => '', 'filesize' => 0); $ret = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => '');
call_hooks('photo_post_file',$ret); call_hooks('photo_post_file',$ret);
@ -670,15 +674,17 @@ function photos_post(&$a) {
$src = $ret['src']; $src = $ret['src'];
$filename = $ret['filename']; $filename = $ret['filename'];
$filesize = $ret['filesize']; $filesize = $ret['filesize'];
$type = $ret['type'];
} }
else { else {
$src = $_FILES['userfile']['tmp_name']; $src = $_FILES['userfile']['tmp_name'];
$filename = basename($_FILES['userfile']['name']); $filename = basename($_FILES['userfile']['name']);
$filesize = intval($_FILES['userfile']['size']); $filesize = intval($_FILES['userfile']['size']);
$type = $_FILES['userfile']['type'];
} }
logger('photos: upload: received file: ' . $filename . ' as ' . $src . ' '. $type . ' ' . $filesize . ' bytes', LOGGER_DEBUG);
logger('photos: upload: received file: ' . $filename . ' as ' . $src . ' ' . $filesize . ' bytes', LOGGER_DEBUG);
$maximagesize = get_config('system','maximagesize'); $maximagesize = get_config('system','maximagesize');
@ -701,7 +707,7 @@ function photos_post(&$a) {
logger('mod/photos.php: photos_post(): loading the contents of ' . $src , LOGGER_DEBUG); logger('mod/photos.php: photos_post(): loading the contents of ' . $src , LOGGER_DEBUG);
$imagedata = @file_get_contents($src); $imagedata = @file_get_contents($src);
$ph = new Photo($imagedata); $ph = new Photo($imagedata, $type);
if(! $ph->is_valid()) { if(! $ph->is_valid()) {
logger('mod/photos.php: photos_post(): unable to process image' , LOGGER_DEBUG); logger('mod/photos.php: photos_post(): unable to process image' , LOGGER_DEBUG);
@ -771,7 +777,7 @@ function photos_post(&$a) {
$arr['origin'] = 1; $arr['origin'] = 1;
$arr['body'] = '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo_hash . ']' $arr['body'] = '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo_hash . ']'
. '[img]' . $a->get_baseurl() . "/photo/{$photo_hash}-{$smallest}.jpg" . '[/img]' . '[img]' . $a->get_baseurl() . "/photo/{$photo_hash}-{$smallest}.".$ph->getExt() . '[/img]'
. '[/url]'; . '[/url]';
$item_id = item_store($arr); $item_id = item_store($arr);
@ -814,8 +820,8 @@ function photos_content(&$a) {
notice( t('Public access denied.') . EOL); notice( t('Public access denied.') . EOL);
return; return;
} }
require_once('include/bbcode.php'); require_once('include/bbcode.php');
require_once('include/security.php'); require_once('include/security.php');
require_once('include/conversation.php'); require_once('include/conversation.php');
@ -825,6 +831,8 @@ function photos_content(&$a) {
return; return;
} }
$phototypes = Photo::supportedTypes();
$_SESSION['photo_return'] = $a->cmd; $_SESSION['photo_return'] = $a->cmd;
// //
@ -991,7 +999,7 @@ function photos_content(&$a) {
$a->set_pager_itemspage(20); $a->set_pager_itemspage(20);
} }
$r = q("SELECT `resource-id`, `id`, `filename`, max(`scale`) AS `scale`, `desc` FROM `photo` WHERE `uid` = %d AND `album` = '%s' $r = q("SELECT `resource-id`, `id`, `filename`, type, max(`scale`) AS `scale`, `desc` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT %d , %d", AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT %d , %d",
intval($owner_uid), intval($owner_uid),
dbesc($album), dbesc($album),
@ -1038,13 +1046,15 @@ function photos_content(&$a) {
$twist = 'rotleft'; $twist = 'rotleft';
else else
$twist = 'rotright'; $twist = 'rotright';
$ext = $phototypes[$rr['type']];
$o .= replace_macros($tpl,array( $o .= replace_macros($tpl,array(
'$id' => $rr['id'], '$id' => $rr['id'],
'$twist' => ' ' . $twist . rand(2,4), '$twist' => ' ' . $twist . rand(2,4),
'$photolink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'], '$photolink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'],
'$phototitle' => t('View Photo'), '$phototitle' => t('View Photo'),
'$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.jpg', '$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.' .$ext,
'$imgalt' => template_escape($rr['filename']), '$imgalt' => template_escape($rr['filename']),
'$desc'=> template_escape($rr['desc']) '$desc'=> template_escape($rr['desc'])
)); ));
@ -1158,9 +1168,9 @@ function photos_content(&$a) {
$prevlink = array($prevlink, '<div class="icon prev"></div>') ; $prevlink = array($prevlink, '<div class="icon prev"></div>') ;
$photo = array( $photo = array(
'href' => $a->get_baseurl() . '/photo/' . $hires['resource-id'] . '-' . $hires['scale'] . '.jpg', 'href' => $a->get_baseurl() . '/photo/' . $hires['resource-id'] . '-' . $hires['scale'] . '.' . $phototypes[$hires['type']],
'title'=> t('View Full Size'), 'title'=> t('View Full Size'),
'src' => $a->get_baseurl() . '/photo/' . $lores['resource-id'] . '-' . $lores['scale'] . '.jpg' . '?f=&_u=' . datetime_convert('','','','ymdhis') 'src' => $a->get_baseurl() . '/photo/' . $lores['resource-id'] . '-' . $lores['scale'] . '.' . $phototypes[$lores['type']] . '?f=&_u=' . datetime_convert('','','','ymdhis')
); );
if($nextlink) if($nextlink)
@ -1449,7 +1459,7 @@ function photos_content(&$a) {
$a->set_pager_itemspage(20); $a->set_pager_itemspage(20);
} }
$r = q("SELECT `resource-id`, `id`, `filename`, `album`, max(`scale`) AS `scale` FROM `photo` $r = q("SELECT `resource-id`, `id`, `filename`, type, `album`, max(`scale`) AS `scale` FROM `photo`
WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
$sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT %d , %d", $sql_extra GROUP BY `resource-id` ORDER BY `created` DESC LIMIT %d , %d",
intval($a->data['user']['uid']), intval($a->data['user']['uid']),
@ -1469,13 +1479,14 @@ function photos_content(&$a) {
$twist = 'rotleft'; $twist = 'rotleft';
else else
$twist = 'rotright'; $twist = 'rotright';
$ext = $phototypes[$rr['type']];
$photos[] = array( $photos[] = array(
'id' => $rr['id'], 'id' => $rr['id'],
'twist' => ' ' . $twist . rand(2,4), 'twist' => ' ' . $twist . rand(2,4),
'link' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'], 'link' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'],
'title' => t('View Photo'), 'title' => t('View Photo'),
'src' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.jpg', 'src' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.' . $ext,
'alt' => template_escape($rr['filename']), 'alt' => template_escape($rr['filename']),
'album' => array( 'album' => array(
'link' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($rr['album']), 'link' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($rr['album']),

View File

@ -53,7 +53,7 @@ function profile_photo_post(&$a) {
$base_image = $r[0]; $base_image = $r[0];
$im = new Photo($base_image['data']); $im = new Photo($base_image['data'], $base_image['type']);
if($im->is_valid()) { if($im->is_valid()) {
$im->cropImage(175,$srcX,$srcY,$srcW,$srcH); $im->cropImage(175,$srcX,$srcY,$srcW,$srcH);
@ -108,6 +108,7 @@ function profile_photo_post(&$a) {
$src = $_FILES['userfile']['tmp_name']; $src = $_FILES['userfile']['tmp_name'];
$filename = basename($_FILES['userfile']['name']); $filename = basename($_FILES['userfile']['name']);
$filesize = intval($_FILES['userfile']['size']); $filesize = intval($_FILES['userfile']['size']);
$filetype = $_FILES['userfile']['type'];
$maximagesize = get_config('system','maximagesize'); $maximagesize = get_config('system','maximagesize');
@ -118,7 +119,7 @@ function profile_photo_post(&$a) {
} }
$imagedata = @file_get_contents($src); $imagedata = @file_get_contents($src);
$ph = new Photo($imagedata); $ph = new Photo($imagedata, $filetype);
if(! $ph->is_valid()) { if(! $ph->is_valid()) {
notice( t('Unable to process image.') . EOL ); notice( t('Unable to process image.') . EOL );
@ -193,7 +194,7 @@ function profile_photo_content(&$a) {
goaway($a->get_baseurl() . '/profiles'); goaway($a->get_baseurl() . '/profiles');
return; // NOTREACHED return; // NOTREACHED
} }
$ph = new Photo($r[0]['data']); $ph = new Photo($r[0]['data'], $r[0]['type']);
profile_photo_crop_ui_head($a, $ph); profile_photo_crop_ui_head($a, $ph);
// go ahead as we have jus uploaded a new photo to crop // go ahead as we have jus uploaded a new photo to crop
} }
@ -214,7 +215,7 @@ function profile_photo_content(&$a) {
return $o; return $o;
} }
else { else {
$filename = $a->config['imagecrop'] . '-' . $a->config['imagecrop_resolution'] . '.jpg'; $filename = $a->config['imagecrop'] . '-' . $a->config['imagecrop_resolution'] . '.'.$a->config['imagecrop_ext'];
$resolution = $a->config['imagecrop_resolution']; $resolution = $a->config['imagecrop_resolution'];
$tpl = get_markup_template("cropbody.tpl"); $tpl = get_markup_template("cropbody.tpl");
$o .= replace_macros($tpl,array( $o .= replace_macros($tpl,array(
@ -268,6 +269,7 @@ function profile_photo_crop_ui_head(&$a, $ph){
$a->config['imagecrop'] = $hash; $a->config['imagecrop'] = $hash;
$a->config['imagecrop_resolution'] = $smallest; $a->config['imagecrop_resolution'] = $smallest;
$a->config['imagecrop_ext'] = $ph->getExt();
$a->page['htmlhead'] .= get_markup_template("crophead.tpl"); $a->page['htmlhead'] .= get_markup_template("crophead.tpl");
return; return;
}} }}

View File

@ -57,16 +57,18 @@ function wall_upload_post(&$a) {
if(! x($_FILES,'userfile') && ! x($_FILES,'media')) if(! x($_FILES,'userfile') && ! x($_FILES,'media'))
killme(); killme();
if(x($_FILES,'userfile')) { if(x($_FILES,'userfile')) {
$src = $_FILES['userfile']['tmp_name']; $src = $_FILES['userfile']['tmp_name'];
$filename = basename($_FILES['userfile']['name']); $filename = basename($_FILES['userfile']['name']);
$filesize = intval($_FILES['userfile']['size']); $filesize = intval($_FILES['userfile']['size']);
} $filetype = $_FILES['userfile']['type'];
elseif(x($_FILES,'media')) { }
$src = $_FILES['media']['tmp_name']; elseif(x($_FILES,'media')) {
$filename = basename($_FILES['media']['name']); $src = $_FILES['media']['tmp_name'];
$filesize = intval($_FILES['media']['size']); $filename = basename($_FILES['media']['name']);
} $filesize = intval($_FILES['media']['size']);
$filetype = $_FILES['media']['type'];
}
$maximagesize = get_config('system','maximagesize'); $maximagesize = get_config('system','maximagesize');
@ -77,7 +79,7 @@ function wall_upload_post(&$a) {
} }
$imagedata = @file_get_contents($src); $imagedata = @file_get_contents($src);
$ph = new Photo($imagedata); $ph = new Photo($imagedata, $filetype);
if(! $ph->is_valid()) { if(! $ph->is_valid()) {
echo ( t('Unable to process image.') . EOL); echo ( t('Unable to process image.') . EOL);
@ -123,19 +125,19 @@ function wall_upload_post(&$a) {
/* mod Waitman Gobble NO WARRANTY */ /* mod Waitman Gobble NO WARRANTY */
//if we get the signal then return the image url info in BBCODE, otherwise this outputs the info and bails (for the ajax image uploader on wall post) //if we get the signal then return the image url info in BBCODE, otherwise this outputs the info and bails (for the ajax image uploader on wall post)
if ($_REQUEST['hush']!='yeah') { if ($_REQUEST['hush']!='yeah') {
/*existing code*/ /*existing code*/
if(local_user() && intval(get_pconfig(local_user(),'system','plaintext'))) if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
echo "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]\n\n"; echo "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.".$ph->getExt()."[/img][/url]\n\n";
else else
echo '<br /><br /><a href="' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '" ><img src="' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg\" alt=\"$basename\" /></a><br /><br />"; echo '<br /><br /><a href="' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '" ><img src="' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.".$ph->getExt()."\" alt=\"$basename\" /></a><br /><br />";
/*existing code*/ /*existing code*/
} else { } else {
$m = '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]"; $m = '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.".$ph->getExt()."[/img][/url]";
return($m); return($m);
} }
/* mod Waitman Gobble NO WARRANTY */ /* mod Waitman Gobble NO WARRANTY */
killme(); killme();

View File

@ -1,6 +1,6 @@
<?php <?php
define( 'UPDATE_VERSION' , 1148 ); define( 'UPDATE_VERSION' , 1149 );
/** /**
* *
@ -1283,3 +1283,9 @@ function update_1147() {
return UPDATE_SUCCESS ; return UPDATE_SUCCESS ;
} }
function update_1148() {
$r = q("ALTER TABLE photo ADD type CHAR(128) NOT NULL DEFAULT 'image/jpeg' AFTER filename");
if (!$r)
return UPDATE_FAILED;
return UPDATE_SUCCESS;
}