imageproxy/index.php
Jeroen De Meerleer 8fbbccfa21
Improved image handling logic
The image processing logic has been updated to better handle optional parameters. Previously, the code would always pad and resize the canvas regardless of whether width, height, or canvas dimensions were provided. Now, padding and resizing only occur if the corresponding options are set. This change makes the code more flexible and prevents potential errors when certain parameters are not provided.
2024-07-23 13:55:20 +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\Imagick\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;
}