mirror of
https://github.com/HaschekSolutions/pictshare.git
synced 2025-11-12 11:16:22 +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)
|
public function handleHash($hash,$url)
|
||||||
{
|
{
|
||||||
$path = ROOT.DS.'data'.DS.$hash.DS.$hash;
|
$path = ROOT.DS.'data'.DS.$hash.DS.$hash;
|
||||||
|
|
||||||
$type = getExtensionOfFilename($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)
|
switch($type)
|
||||||
{
|
{
|
||||||
case 'jpeg':
|
case 'jpeg':
|
||||||
@@ -95,4 +162,30 @@ class ImageController implements ContentController
|
|||||||
break;
|
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
|
//disable output buffering
|
||||||
if (ob_get_level()) ob_end_clean();
|
if (ob_get_level()) ob_end_clean();
|
||||||
|
|
||||||
|
error_reporting(E_ALL & ~E_NOTICE);
|
||||||
|
|
||||||
if(!defined('FFMPEG_BINARY'))
|
if(!defined('FFMPEG_BINARY'))
|
||||||
define('FFMPEG_BINARY',ROOT.DS.'bin'.DS.'ffmpeg');
|
define('FFMPEG_BINARY',ROOT.DS.'bin'.DS.'ffmpeg');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user