Add support for PNG images with alpha
This commit is contained in:
parent
1d832618a4
commit
7cc8c369cb
11 changed files with 215 additions and 70 deletions
|
|
@ -7,14 +7,34 @@ class Photo {
|
|||
private $width;
|
||||
private $height;
|
||||
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->type = $type;
|
||||
$this->image = @imagecreatefromstring($data);
|
||||
if($this->image !== FALSE) {
|
||||
$this->width = imagesx($this->image);
|
||||
$this->height = imagesy($this->image);
|
||||
$this->valid = true;
|
||||
imagealphablending($this->image, false);
|
||||
imagesavealpha($this->image, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -38,6 +58,13 @@ class Photo {
|
|||
public function getImage() {
|
||||
return $this->image;
|
||||
}
|
||||
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
public function getExt() {
|
||||
return $this->types[$this->type];
|
||||
}
|
||||
|
||||
public function scaleImage($max) {
|
||||
|
||||
|
|
@ -78,6 +105,9 @@ class Photo {
|
|||
|
||||
|
||||
$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);
|
||||
if($this->image)
|
||||
imagedestroy($this->image);
|
||||
|
|
@ -134,6 +164,9 @@ class Photo {
|
|||
|
||||
|
||||
$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);
|
||||
if($this->image)
|
||||
imagedestroy($this->image);
|
||||
|
|
@ -148,6 +181,9 @@ class Photo {
|
|||
public function scaleImageSquare($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);
|
||||
if($this->image)
|
||||
imagedestroy($this->image);
|
||||
|
|
@ -159,6 +195,9 @@ class Photo {
|
|||
|
||||
public function cropImage($max,$x,$y,$w,$h) {
|
||||
$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);
|
||||
if($this->image)
|
||||
imagedestroy($this->image);
|
||||
|
|
@ -168,20 +207,38 @@ class Photo {
|
|||
}
|
||||
|
||||
public function saveImage($path) {
|
||||
$quality = get_config('system','jpeg_quality');
|
||||
if((! $quality) || ($quality > 100))
|
||||
$quality = JPEG_QUALITY;
|
||||
imagejpeg($this->image,$path,$quality);
|
||||
switch($this->type){
|
||||
case "image/png":
|
||||
$quality = get_config('system','png_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() {
|
||||
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');
|
||||
if((! $quality) || ($quality > 100))
|
||||
$quality = JPEG_QUALITY;
|
||||
|
||||
imagejpeg($this->image,NULL,$quality);
|
||||
imagejpeg($this->image,NULL,$quality);
|
||||
}
|
||||
$s = ob_get_contents();
|
||||
ob_end_clean();
|
||||
return $s;
|
||||
|
|
@ -200,8 +257,8 @@ class Photo {
|
|||
$guid = get_guid();
|
||||
|
||||
$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` )
|
||||
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
|
||||
( `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', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
|
||||
intval($uid),
|
||||
intval($cid),
|
||||
dbesc($guid),
|
||||
|
|
@ -209,6 +266,7 @@ class Photo {
|
|||
dbesc(datetime_convert()),
|
||||
dbesc(datetime_convert()),
|
||||
dbesc(basename($filename)),
|
||||
dbesc($this->type),
|
||||
dbesc($album),
|
||||
intval($this->height),
|
||||
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) {
|
||||
|
||||
$a = get_app();
|
||||
|
|
@ -238,7 +328,12 @@ function import_profile_photo($photo,$uid,$cid) {
|
|||
|
||||
$filename = basename($photo);
|
||||
$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()) {
|
||||
|
||||
$img->scaleImageSquare(175);
|
||||
|
|
@ -266,9 +361,9 @@ function import_profile_photo($photo,$uid,$cid) {
|
|||
|
||||
|
||||
|
||||
$photo = $a->get_baseurl() . '/photo/' . $hash . '-4.jpg';
|
||||
$thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.jpg';
|
||||
$micro = $a->get_baseurl() . '/photo/' . $hash . '-6.jpg';
|
||||
$photo = $a->get_baseurl() . '/photo/' . $hash . '-4.' . $img->getExt();
|
||||
$thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.' . $img->getExt();
|
||||
$micro = $a->get_baseurl() . '/photo/' . $hash . '-6.' . $img->getExt();
|
||||
}
|
||||
else
|
||||
$photo_failure = true;
|
||||
|
|
|
|||
|
|
@ -1346,7 +1346,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
|
|||
}
|
||||
|
||||
$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($have_photo) {
|
||||
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'
|
||||
WHERE `uid` = %d AND `id` = %d LIMIT 1",
|
||||
dbesc(datetime_convert()),
|
||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.jpg'),
|
||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.jpg'),
|
||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.jpg'),
|
||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
|
||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
|
||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
|
||||
intval($contact['uid']),
|
||||
intval($contact['id'])
|
||||
);
|
||||
|
|
|
|||
|
|
@ -807,8 +807,11 @@ function scale_external_images($s,$include_link = true) {
|
|||
if(stristr($mtch[1],$hostname))
|
||||
continue;
|
||||
$i = fetch_url($mtch[1]);
|
||||
// guess mimetype from headers or filename
|
||||
$type = guess_image_type($mtch[1],true);
|
||||
|
||||
if($i) {
|
||||
$ph = new Photo($i);
|
||||
$ph = new Photo($i, $type);
|
||||
if($ph->is_valid()) {
|
||||
$orig_width = $ph->getWidth();
|
||||
$orig_height = $ph->getHeight();
|
||||
|
|
|
|||
|
|
@ -284,7 +284,11 @@ function create_user($arr) {
|
|||
|
||||
$filename = basename($photo);
|
||||
$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()) {
|
||||
|
||||
$img->scaleImageSquare(175);
|
||||
|
|
@ -324,4 +328,4 @@ function create_user($arr) {
|
|||
$result['user'] = $u;
|
||||
return $result;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue