imageproxy/index.php
Jeroen De Meerleer fc36888b7d
Updated image driver in ImageManager
The image driver used in the ImageManager instance has been switched from Imagick to Gd. This change should not affect any existing functionality but may improve performance and compatibility with different server setups.
2024-09-16 15:45:47 +02:00

92 lines
3.1 KiB
PHP

<?php
// include composer autoload
require 'vendor/autoload.php';
ini_set('memory_limit', '4G');
ini_set( 'user_agent', 'CoolBot/0.0 (https://example.org/coolbot/; coolbot@example.org)' );
error_reporting(E_ALL);
ini_set('display_errors', 1);
// import the Intervention Image Manager Class
use Intervention\Image\Exceptions\DecoderException;
use Intervention\Image\ImageManager;
use Symfony\Component\HttpFoundation\Response;
// create an image manager instance with favored driver
$manager = new ImageManager(\Intervention\Image\Drivers\Gd\Driver::class);
if(php_sapi_name() == 'cli') {
$args = NULL;
parse_str($argv[1], $args);
} else {
$args = $_GET;
}
$options = [
'url' => $args['url'],
'height' => $args['h'] ?? NULL,
'width' => $args['w'] ?? NULL,
'canvasheight' => $args['ch'] ?? NULL,
'canvaswidth' => $args['cw'] ?? NULL,
'format' => $args['format'] ?? NULL,
'fill' => $args['fill'] ?? NULL,
];
$cachefolder = [];
foreach($options as $key => $option) {
if($key != 'url' && $option != NULL) $cachefolder[] = $key . '-' . $option;
}
$cachefolder = implode('_', $cachefolder);
$cachefile = preg_replace("/[^A-Za-z0-9]/", '-', $options['url']);
if(is_dir('cache/' . $cachefolder)) {
if(is_file('cache/'. $cachefolder . '/' . $cachefile) && (filemtime('cache/'. $cachefolder . '/' . $cachefile) > (time() - (60*60*24*30)))) {
sendFile('cache/' . $cachefolder . '/' . $cachefile);
exit;
}
};
$imagecontent = file_get_contents($options['url']);
if(isSvg($imagecontent)) {
$image = new Imagick();
$image->setBackgroundColor('none');
$image->readImageBlob($imagecontent);
$image->setImageFormat("png64");
$image->resizeImage(2000,2000, imagick::FILTER_QUADRATIC, 0.7, true);
$imagecontent = $image->getImageBlob();
}
$transparent = (new \Intervention\Image\Colors\Rgb\Color(0,0,0,0));
// to finally create image instances
$image = $manager
->read($imagecontent);
if(isset($options['width']) || isset($options['height'])) {
$image = $image->pad($options['width'], $options['height'], $transparent);
}
if(isset($options['canvaswidth']) || isset($options['canvasheight'])) {
$image = $image->resizeCanvas($options['canvaswidth'], $options['canvasheight'], $transparent);
}
if (isset($options['fill'])) {
$image = $image->blendTransparency($options['fill']);
}
// send HTTP header and output image data
if(!is_dir('cache/' . $cachefolder)) mkdir('cache/' . $cachefolder);
if(isset($args['format'])) {
$image = $image->encodeByExtension($args['format']);
}
$image->save('cache/' . $cachefolder . '/' . $cachefile);
sendFile('cache/' . $cachefolder . '/' . $cachefile);
function sendFile($filepath) {
$filecontents = file_get_contents($filepath);
$mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $filecontents);
$length = strlen($filecontents);
$response = new Response($filecontents, Response::HTTP_OK, ['Content-Type' => $mime, 'Content-Length' => $length]);
$response->send();
}
function isSvg($content)
{
// Controleer of de inhoud begint met de kenmerkende SVG-declaratie
return strpos($content, '<svg') !== false;
}