Added optipng/jpgoptim support to thumbnails
This commit is contained in:
parent
355e088fad
commit
ccca71c1b8
5 changed files with 53 additions and 12 deletions
|
@ -18,7 +18,6 @@ class ImageConverter
|
||||||
$this->imageManipulator = $imageManipulator;
|
$this->imageManipulator = $imageManipulator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function createImageFromBuffer($source)
|
public function createImageFromBuffer($source)
|
||||||
{
|
{
|
||||||
$tmpSourcePath = tempnam(sys_get_temp_dir(), 'thumb') . '.dat';
|
$tmpSourcePath = tempnam(sys_get_temp_dir(), 'thumb') . '.dat';
|
||||||
|
|
|
@ -81,6 +81,7 @@ class GdImageManipulator implements IImageManipulator
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
throw new \InvalidArgumentException('Not supported');
|
||||||
}
|
}
|
||||||
|
|
||||||
$buffer = ob_get_contents();
|
$buffer = ob_get_contents();
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
namespace Szurubooru\Services;
|
namespace Szurubooru\Services;
|
||||||
use Szurubooru\Services\ImageManipulation\IImageManipulator;
|
|
||||||
use Szurubooru\Services\ImageManipulation\ImageManipulator;
|
use Szurubooru\Services\ImageManipulation\ImageManipulator;
|
||||||
|
|
||||||
class ThumbnailGenerator
|
class ThumbnailGenerator
|
||||||
|
@ -17,7 +16,7 @@ class ThumbnailGenerator
|
||||||
$this->imageConverter = $imageConverter;
|
$this->imageConverter = $imageConverter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generate($source, $width, $height, $cropStyle)
|
public function generate($source, $width, $height, $cropStyle, $format)
|
||||||
{
|
{
|
||||||
$image = $this->imageConverter->createImageFromBuffer($source);
|
$image = $this->imageConverter->createImageFromBuffer($source);
|
||||||
if (!$image)
|
if (!$image)
|
||||||
|
@ -40,9 +39,7 @@ class ThumbnailGenerator
|
||||||
throw new \InvalidArgumentException('Unknown thumbnail crop style');
|
throw new \InvalidArgumentException('Unknown thumbnail crop style');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->imageManipulator->saveToBuffer(
|
return $this->imageManipulator->saveToBuffer($image, $format);
|
||||||
$image,
|
|
||||||
IImageManipulator::FORMAT_JPEG);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function cropOutside(&$image, $srcWidth, $srcHeight, $dstWidth, $dstHeight)
|
private function cropOutside(&$image, $srcWidth, $srcHeight, $dstWidth, $dstHeight)
|
||||||
|
|
|
@ -2,10 +2,15 @@
|
||||||
namespace Szurubooru\Services;
|
namespace Szurubooru\Services;
|
||||||
use Szurubooru\Config;
|
use Szurubooru\Config;
|
||||||
use Szurubooru\Dao\PublicFileDao;
|
use Szurubooru\Dao\PublicFileDao;
|
||||||
|
use Szurubooru\Helpers\ProgramExecutor;
|
||||||
|
use Szurubooru\Services\ImageManipulation\IImageManipulator;
|
||||||
use Szurubooru\Services\ThumbnailGenerator;
|
use Szurubooru\Services\ThumbnailGenerator;
|
||||||
|
|
||||||
class ThumbnailService
|
class ThumbnailService
|
||||||
{
|
{
|
||||||
|
const PROGRAM_NAME_JPEGOPTIM = 'jpegoptim';
|
||||||
|
const PROGRAM_NAME_OPTIPNG = 'optipng';
|
||||||
|
|
||||||
private $config;
|
private $config;
|
||||||
private $fileDao;
|
private $fileDao;
|
||||||
private $thumbnailGenerator;
|
private $thumbnailGenerator;
|
||||||
|
@ -59,11 +64,13 @@ class ThumbnailService
|
||||||
$source = $this->fileDao->load($sourceName);
|
$source = $this->fileDao->load($sourceName);
|
||||||
if ($source)
|
if ($source)
|
||||||
{
|
{
|
||||||
$thumbnailContent = $this->thumbnailGenerator->generate($source, $width, $height, $cropStyle);
|
$format = $this->getFormat();
|
||||||
|
$thumbnailContent = $this->thumbnailGenerator->generate($source, $width, $height, $cropStyle, $format);
|
||||||
if ($thumbnailContent)
|
if ($thumbnailContent)
|
||||||
{
|
{
|
||||||
$targetName = $this->getTargetName($sourceName, $width, $height);
|
$targetName = $this->getTargetName($sourceName, $width, $height);
|
||||||
$this->fileDao->save($targetName, $thumbnailContent);
|
$this->fileDao->save($targetName, $thumbnailContent);
|
||||||
|
$this->optimize($targetName, $format);
|
||||||
return $targetName;
|
return $targetName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,4 +104,35 @@ class ThumbnailService
|
||||||
{
|
{
|
||||||
return 'thumbnails' . DIRECTORY_SEPARATOR . 'blank.png';
|
return 'thumbnails' . DIRECTORY_SEPARATOR . 'blank.png';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getFormat()
|
||||||
|
{
|
||||||
|
return IImageManipulator::FORMAT_JPEG;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function optimize($sourceName, $format)
|
||||||
|
{
|
||||||
|
$sourcePath = $this->fileDao->getFullPath($sourceName);
|
||||||
|
|
||||||
|
if ($format === IImageManipulator::FORMAT_JPEG and ProgramExecutor::isProgramAvailable(self::PROGRAM_NAME_JPEGOPTIM))
|
||||||
|
{
|
||||||
|
ProgramExecutor::run(
|
||||||
|
self::PROGRAM_NAME_JPEGOPTIM,
|
||||||
|
[
|
||||||
|
'--quiet',
|
||||||
|
'--strip-all',
|
||||||
|
$sourcePath,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
elseif ($format === IImageManipulator::FORMAT_PNG and ProgramExecutor::isProgramAvailable(self::PROGRAM_NAME_OPTIPNG))
|
||||||
|
{
|
||||||
|
ProgramExecutor::run(
|
||||||
|
self::PROGRAM_NAME_OPTIPNG,
|
||||||
|
[
|
||||||
|
'-o2',
|
||||||
|
$sourcePath,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ namespace Szurubooru\Tests\Services;
|
||||||
use Szurubooru\Helpers\ProgramExecutor;
|
use Szurubooru\Helpers\ProgramExecutor;
|
||||||
use Szurubooru\Injector;
|
use Szurubooru\Injector;
|
||||||
use Szurubooru\Services\ImageConverter;
|
use Szurubooru\Services\ImageConverter;
|
||||||
|
use Szurubooru\Services\ImageManipulation\IImageManipulator;
|
||||||
use Szurubooru\Services\ImageManipulation\ImageManipulator;
|
use Szurubooru\Services\ImageManipulation\ImageManipulator;
|
||||||
use Szurubooru\Services\ThumbnailGenerator;
|
use Szurubooru\Services\ThumbnailGenerator;
|
||||||
use Szurubooru\Tests\AbstractTestCase;
|
use Szurubooru\Tests\AbstractTestCase;
|
||||||
|
@ -24,7 +25,8 @@ final class ThumbnailGeneratorTest extends AbstractTestCase
|
||||||
$this->getTestFile('flash.swf'),
|
$this->getTestFile('flash.swf'),
|
||||||
150,
|
150,
|
||||||
150,
|
150,
|
||||||
ThumbnailGenerator::CROP_OUTSIDE);
|
ThumbnailGenerator::CROP_OUTSIDE,
|
||||||
|
IImageManipulator::FORMAT_PNG);
|
||||||
|
|
||||||
$image = $imageManipulator->loadFromBuffer($result);
|
$image = $imageManipulator->loadFromBuffer($result);
|
||||||
$this->assertEquals(150, $imageManipulator->getImageWidth($image));
|
$this->assertEquals(150, $imageManipulator->getImageWidth($image));
|
||||||
|
@ -46,7 +48,8 @@ final class ThumbnailGeneratorTest extends AbstractTestCase
|
||||||
$this->getTestFile('video.mp4'),
|
$this->getTestFile('video.mp4'),
|
||||||
150,
|
150,
|
||||||
150,
|
150,
|
||||||
ThumbnailGenerator::CROP_OUTSIDE);
|
ThumbnailGenerator::CROP_OUTSIDE,
|
||||||
|
IImageManipulator::FORMAT_PNG);
|
||||||
|
|
||||||
$image = $imageManipulator->loadFromBuffer($result);
|
$image = $imageManipulator->loadFromBuffer($result);
|
||||||
$this->assertEquals(150, $imageManipulator->getImageWidth($image));
|
$this->assertEquals(150, $imageManipulator->getImageWidth($image));
|
||||||
|
@ -62,7 +65,8 @@ final class ThumbnailGeneratorTest extends AbstractTestCase
|
||||||
$this->getTestFile('image.jpg'),
|
$this->getTestFile('image.jpg'),
|
||||||
150,
|
150,
|
||||||
150,
|
150,
|
||||||
ThumbnailGenerator::CROP_OUTSIDE);
|
ThumbnailGenerator::CROP_OUTSIDE,
|
||||||
|
IImageManipulator::FORMAT_PNG);
|
||||||
|
|
||||||
$image = $imageManipulator->loadFromBuffer($result);
|
$image = $imageManipulator->loadFromBuffer($result);
|
||||||
$this->assertEquals(150, $imageManipulator->getImageWidth($image));
|
$this->assertEquals(150, $imageManipulator->getImageWidth($image));
|
||||||
|
@ -72,7 +76,8 @@ final class ThumbnailGeneratorTest extends AbstractTestCase
|
||||||
$this->getTestFile('image.jpg'),
|
$this->getTestFile('image.jpg'),
|
||||||
150,
|
150,
|
||||||
150,
|
150,
|
||||||
ThumbnailGenerator::CROP_INSIDE);
|
ThumbnailGenerator::CROP_INSIDE,
|
||||||
|
IImageManipulator::FORMAT_PNG);
|
||||||
|
|
||||||
$image = $imageManipulator->loadFromBuffer($result);
|
$image = $imageManipulator->loadFromBuffer($result);
|
||||||
$this->assertEquals(150, $imageManipulator->getImageWidth($image));
|
$this->assertEquals(150, $imageManipulator->getImageWidth($image));
|
||||||
|
@ -89,7 +94,8 @@ final class ThumbnailGeneratorTest extends AbstractTestCase
|
||||||
$this->getTestFile('text.txt'),
|
$this->getTestFile('text.txt'),
|
||||||
150,
|
150,
|
||||||
150,
|
150,
|
||||||
ThumbnailGenerator::CROP_OUTSIDE);
|
ThumbnailGenerator::CROP_OUTSIDE,
|
||||||
|
IImageManipulator::FORMAT_PNG);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getImageManipulator()
|
public function getImageManipulator()
|
||||||
|
|
Loading…
Reference in a new issue