Skip to content

Commit

Permalink
support multiple mime types #64
Browse files Browse the repository at this point in the history
  • Loading branch information
flokosiol committed Nov 29, 2021
1 parent a906e5f commit c2036f2
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 8 deletions.
60 changes: 55 additions & 5 deletions src/Focus/GdLib.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,24 @@

namespace Flokosiol\Focus;

ini_set('memory_limit', '512M');

use claviska\SimpleImage;
use Kirby\Image\Image;
use Kirby\Image\Dimensions;
use Kirby\Filesystem\Mime;
use Kirby\Image\Darkroom;
use Kirby\Image\Image;

class GdLib extends Darkroom
{
/**
* Processes the image with the SimpleImage library
*
* @param string $file
* @param array $options
* @return array
*/
public function process(string $file, array $options = []): array
{
$options = $this->preprocess($file, $options);
$mime = $this->mime($options);

// original image dimension for focus cropping
$originalImage = new Image($file);
Expand All @@ -30,11 +36,19 @@ public function process(string $file, array $options = []): array
$image = $this->blur($image, $options);
$image = $this->grayscale($image, $options);

$image->toFile($file, null, $options['quality']);
$image->toFile($file, $mime, $options['quality']);

return $options;
}

/**
* Activates the autoOrient option in SimpleImage
* unless this is deactivated
*
* @param \claviska\SimpleImage $image
* @param $options
* @return \claviska\SimpleImage
*/
protected function autoOrient(SimpleImage $image, $options)
{
if ($options['autoOrient'] === false) {
Expand All @@ -44,6 +58,13 @@ protected function autoOrient(SimpleImage $image, $options)
return $image->autoOrient();
}

/**
* Wrapper around SimpleImage's resize and crop methods
*
* @param \claviska\SimpleImage $image
* @param array $options
* @return \claviska\SimpleImage
*/
protected function resize(SimpleImage $image, array $options)
{
if ($options['crop'] === false) {
Expand All @@ -60,6 +81,13 @@ protected function resize(SimpleImage $image, array $options)

}

/**
* Applies the correct blur settings for SimpleImage
*
* @param \claviska\SimpleImage $image
* @param array $options
* @return \claviska\SimpleImage
*/
protected function blur(SimpleImage $image, array $options)
{
if ($options['blur'] === false) {
Expand All @@ -69,6 +97,13 @@ protected function blur(SimpleImage $image, array $options)
return $image->blur('gaussian', (int)$options['blur']);
}

/**
* Applies grayscale conversion if activated in the options.
*
* @param \claviska\SimpleImage $image
* @param array $options
* @return \claviska\SimpleImage
*/
protected function grayscale(SimpleImage $image, array $options)
{
if ($options['grayscale'] === false) {
Expand All @@ -77,4 +112,19 @@ protected function grayscale(SimpleImage $image, array $options)

return $image->desaturate();
}

/**
* Returns mime type based on `format` option
*
* @param array $options
* @return string|null
*/
protected function mime(array $options): ?string
{
if ($options['format'] === null) {
return null;
}

return Mime::fromExtension($options['format']);
}
}
96 changes: 93 additions & 3 deletions src/Focus/ImageMagick.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,72 @@
namespace Flokosiol\Focus;

use Exception;
use Kirby\Image\Image;
use Kirby\Image\Dimensions;
use Kirby\Filesystem\F;
use Kirby\Image\Darkroom;
use Kirby\Toolkit\F;
use Kirby\Image\Image;

class ImageMagick extends Darkroom
{
/**
* Activates imagemagick's auto-orient feature unless
* it is deactivated via the options
*
* @param string $file
* @param array $options
* @return string
*/
protected function autoOrient(string $file, array $options)
{
if ($options['autoOrient'] === true) {
return '-auto-orient';
}
}

/**
* Applies the blur settings
*
* @param string $file
* @param array $options
* @return string
*/
protected function blur(string $file, array $options)
{
if ($options['blur'] !== false) {
return '-blur 0x' . $options['blur'];
}
}

/**
* Keep animated gifs
*
* @param string $file
* @param array $options
* @return string
*/
protected function coalesce(string $file, array $options)
{
if (F::extension($file) === 'gif') {
return '-coalesce';
}
}

/**
* Creates the convert command with the right path to the binary file
*
* @param string $file
* @param array $options
* @return string
*/
protected function convert(string $file, array $options): string
{
return sprintf($options['bin'] . ' "%s"', $file);
}

/**
* Returns additional default parameters for imagemagick
*
* @return array
*/
protected function defaults(): array
{
return parent::defaults() + [
Expand All @@ -44,20 +77,44 @@ protected function defaults(): array
];
}

/**
* Applies the correct settings for grayscale images
*
* @param string $file
* @param array $options
* @return string
*/
protected function grayscale(string $file, array $options)
{
if ($options['grayscale'] === true) {
return '-colorspace gray';
}
}

/**
* Applies the correct settings for interlaced JPEGs if
* activated via options
*
* @param string $file
* @param array $options
* @return string
*/
protected function interlace(string $file, array $options)
{
if ($options['interlace'] === true) {
return '-interlace line';
}
}

/**
* Creates and runs the full imagemagick command
* to process the image
*
* @param string $file
* @param array $options
* @return array
* @throws \Exception
*/
public function process(string $file, array $options = []): array
{
$options = $this->preprocess($file, $options);
Expand Down Expand Up @@ -96,11 +153,26 @@ public function process(string $file, array $options = []): array
return $options;
}

/**
* Applies the correct JPEG compression quality settings
*
* @param string $file
* @param array $options
* @return string
*/
protected function quality(string $file, array $options): string
{
return '-quality ' . $options['quality'];
}

/**
* Creates the correct options to crop or resize the image
* and translates the crop positions for imagemagick
*
* @param string $file
* @param array $options
* @return string
*/
protected function resize(string $file, array $options): string
{
// simple resize
Expand Down Expand Up @@ -135,11 +207,29 @@ protected function resize(string $file, array $options): string
return $command;
}

/**
* Makes sure to not process too many images at once
* which could crash the server
*
* @param string $file
* @param array $options
* @return string
*/
protected function save(string $file, array $options): string
{
if ($options['format'] !== null) {
$file = basename($file) . '.' . $options['format'];
}
return sprintf('-limit thread 1 "%s"', $file);
}

/**
* Removes all metadata from the image
*
* @param string $file
* @param array $options
* @return string
*/
protected function strip(string $file, array $options): string
{
return '-strip';
Expand Down

0 comments on commit c2036f2

Please sign in to comment.