mirror of
https://github.com/HaschekSolutions/pictshare.git
synced 2025-11-11 18:56:21 +00:00
implemented image resizing and conversion to webp
This commit is contained in:
0
content-controllers/image/conversion.php
Normal file
0
content-controllers/image/conversion.php
Normal file
0
content-controllers/image/filters.php
Normal file
0
content-controllers/image/filters.php
Normal file
@@ -69,8 +69,75 @@ class ImageController implements ContentController
|
||||
public function handleHash($hash,$url)
|
||||
{
|
||||
$path = ROOT.DS.'data'.DS.$hash.DS.$hash;
|
||||
|
||||
$type = getExtensionOfFilename($hash);
|
||||
|
||||
//get all our sub files where all the good functions lie
|
||||
include_once(dirname(__FILE__).DS.'resize.php');
|
||||
include_once(dirname(__FILE__).DS.'filters.php');
|
||||
include_once(dirname(__FILE__).DS.'conversion.php');
|
||||
|
||||
//don't do this if it's a gif because PHP can't handle animated gifs
|
||||
if($type!='gif')
|
||||
{
|
||||
foreach($url as $u)
|
||||
{
|
||||
if(isSize($u))
|
||||
$modifiers['size'] = $u;
|
||||
else if(isRotation($u))
|
||||
$modifiers['rotation'] = $u;
|
||||
}
|
||||
if(in_array('webp',$url) && $type!='webp')
|
||||
$modifiers['webp'] = true;
|
||||
if(in_array('forcesize',$url) && $modifiers['size'])
|
||||
$modifiers['forcesize'] = true;
|
||||
}
|
||||
else //gif
|
||||
{
|
||||
if(in_array('mp4',$url))
|
||||
$modifiers['mp4']=true;
|
||||
}
|
||||
|
||||
if($modifiers)
|
||||
{
|
||||
//why in gods name would you use http build query here???
|
||||
//well we want a unique filename for every modied image
|
||||
//so if we take all parameters in key=>value form and hash it
|
||||
//we get one nice little hash for every eventuality
|
||||
$modhash = md5(http_build_query($modifiers,'',','));
|
||||
$newpath = ROOT.DS.'data'.DS.$hash.DS.$modhash.'_'.$hash;
|
||||
$im = $this->getObjOfImage($path);
|
||||
|
||||
if(!file_exists($newpath))
|
||||
{
|
||||
foreach($modifiers as $mod => $val)
|
||||
{
|
||||
switch($mod)
|
||||
{
|
||||
case 'size':
|
||||
($modifiers['forcesize']?forceResize($im,$val):resize($im,$val));
|
||||
break;
|
||||
|
||||
case 'rotation':
|
||||
rotate($im,$val);
|
||||
break;
|
||||
|
||||
case 'webp':
|
||||
$type = 'webp';
|
||||
break;
|
||||
|
||||
case 'mp4':
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$this->saveObjOfImage($im,$newpath,$type);
|
||||
}
|
||||
$path = $newpath;
|
||||
|
||||
}
|
||||
|
||||
|
||||
switch($type)
|
||||
{
|
||||
case 'jpeg':
|
||||
@@ -95,4 +162,30 @@ class ImageController implements ContentController
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function getObjOfImage($path)
|
||||
{
|
||||
return imagecreatefromstring(file_get_contents($path));
|
||||
}
|
||||
|
||||
function saveObjOfImage($im,$path,$type)
|
||||
{
|
||||
switch($type)
|
||||
{
|
||||
case 'jpeg':
|
||||
case 'jpg':
|
||||
imagejpeg($im,$path,(defined('JPEG_COMPRESSION')?JPEG_COMPRESSION:90));
|
||||
break;
|
||||
|
||||
case 'png':
|
||||
imagepng($im,$path,(defined('PNG_COMPRESSION')?PNG_COMPRESSION:6));
|
||||
break;
|
||||
|
||||
case 'webp':
|
||||
imagewebp($im,$path,(defined('WEBP_COMPRESSION')?WEBP_COMPRESSION:80));
|
||||
break;
|
||||
}
|
||||
|
||||
return $im;
|
||||
}
|
||||
}
|
||||
120
content-controllers/image/resize.php
Normal file
120
content-controllers/image/resize.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
function isRotation($var)
|
||||
{
|
||||
switch($var)
|
||||
{
|
||||
case 'upside':
|
||||
case 'left':
|
||||
case 'right': return true;
|
||||
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
function rotate(&$im,$direction)
|
||||
{
|
||||
switch($direction)
|
||||
{
|
||||
case 'upside': $angle = 180;break;
|
||||
case 'left': $angle = 90;break;
|
||||
case 'right': $angle = -90;break;
|
||||
default: $angle = 0;break;
|
||||
}
|
||||
|
||||
$im = imagerotate($im,$angle,0);
|
||||
}
|
||||
|
||||
function forceResize(&$img,$size)
|
||||
{
|
||||
$sd = sizeStringToWidthHeight($size);
|
||||
$maxwidth = $sd['width'];
|
||||
$maxheight = $sd['height'];
|
||||
|
||||
|
||||
$width = imagesx($img);
|
||||
$height = imagesy($img);
|
||||
|
||||
$maxwidth = ($maxwidth>$width?$width:$maxwidth);
|
||||
$maxheight = ($maxheight>$height?$height:$maxheight);
|
||||
|
||||
|
||||
$dst_img = imagecreatetruecolor($maxwidth, $maxheight);
|
||||
$src_img = $img;
|
||||
|
||||
$palsize = ImageColorsTotal($img);
|
||||
for ($i = 0; $i < $palsize; $i++)
|
||||
{
|
||||
$colors = ImageColorsForIndex($img, $i);
|
||||
ImageColorAllocate($dst_img, $colors['red'], $colors['green'], $colors['blue']);
|
||||
}
|
||||
|
||||
imagefill($dst_img, 0, 0, IMG_COLOR_TRANSPARENT);
|
||||
imagesavealpha($dst_img,true);
|
||||
imagealphablending($dst_img, true);
|
||||
|
||||
$width_new = $height * $maxwidth / $maxheight;
|
||||
$height_new = $width * $maxheight / $maxwidth;
|
||||
//if the new width is greater than the actual width of the image, then the height is too large and the rest cut off, or vice versa
|
||||
if($width_new > $width){
|
||||
//cut point by height
|
||||
$h_point = (($height - $height_new) / 2);
|
||||
//copy image
|
||||
imagecopyresampled($dst_img, $src_img, 0, 0, 0, $h_point, $maxwidth, $maxheight, $width, $height_new);
|
||||
}else{
|
||||
//cut point by width
|
||||
$w_point = (($width - $width_new) / 2);
|
||||
imagecopyresampled($dst_img, $src_img, 0, 0, $w_point, 0, $maxwidth, $maxheight, $width_new, $height);
|
||||
}
|
||||
|
||||
$img = $dst_img;
|
||||
}
|
||||
|
||||
/**
|
||||
* From: https://stackoverflow.com/questions/4590441/php-thumbnail-image-resizing-with-proportions
|
||||
*/
|
||||
function resize(&$img,$size)
|
||||
{
|
||||
$sd = sizeStringToWidthHeight($size);
|
||||
$maxwidth = $sd['width'];
|
||||
$maxheight = $sd['height'];
|
||||
|
||||
$width = imagesx($img);
|
||||
$height = imagesy($img);
|
||||
|
||||
if(defined('ALLOW_BLOATING') && !ALLOW_BLOATING)
|
||||
{
|
||||
if($maxwidth>$width)$maxwidth = $width;
|
||||
if($maxheight>$height)$maxheight = $height;
|
||||
}
|
||||
|
||||
if ($height > $width)
|
||||
{
|
||||
$ratio = $maxheight / $height;
|
||||
$newheight = $maxheight;
|
||||
$newwidth = $width * $ratio;
|
||||
}
|
||||
else
|
||||
{
|
||||
$ratio = $maxwidth / $width;
|
||||
$newwidth = $maxwidth;
|
||||
$newheight = $height * $ratio;
|
||||
}
|
||||
|
||||
$newimg = imagecreatetruecolor($newwidth,$newheight);
|
||||
|
||||
$palsize = ImageColorsTotal($img);
|
||||
for ($i = 0; $i < $palsize; $i++)
|
||||
{
|
||||
$colors = ImageColorsForIndex($img, $i);
|
||||
ImageColorAllocate($newimg, $colors['red'], $colors['green'], $colors['blue']);
|
||||
}
|
||||
|
||||
imagefill($newimg, 0, 0, IMG_COLOR_TRANSPARENT);
|
||||
imagesavealpha($newimg,true);
|
||||
imagealphablending($newimg, true);
|
||||
|
||||
imagecopyresampled($newimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
|
||||
|
||||
$img = $newimg;
|
||||
}
|
||||
@@ -4,6 +4,8 @@ spl_autoload_register('autoload');
|
||||
//disable output buffering
|
||||
if (ob_get_level()) ob_end_clean();
|
||||
|
||||
error_reporting(E_ALL & ~E_NOTICE);
|
||||
|
||||
if(!defined('FFMPEG_BINARY'))
|
||||
define('FFMPEG_BINARY',ROOT.DS.'bin'.DS.'ffmpeg');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user