Use 90% JPEG quality for thumbnails and previews by default

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2017-02-22 12:11:42 +01:00
parent 182bfd9f23
commit 1e281bc616
No known key found for this signature in database
GPG Key ID: E166FD8976B3BAC8
2 changed files with 33 additions and 4 deletions

View File

@ -54,6 +54,8 @@ class OC_Image implements \OCP\IImage {
private $fileInfo; private $fileInfo;
/** @var \OCP\ILogger */ /** @var \OCP\ILogger */
private $logger; private $logger;
/** @var \OCP\IConfig */
private $config;
/** @var array */ /** @var array */
private $exif; private $exif;
@ -79,12 +81,17 @@ class OC_Image implements \OCP\IImage {
* @param resource|string $imageRef The path to a local file, a base64 encoded string or a resource created by * @param resource|string $imageRef The path to a local file, a base64 encoded string or a resource created by
* an imagecreate* function. * an imagecreate* function.
* @param \OCP\ILogger $logger * @param \OCP\ILogger $logger
* @param \OCP\IConfig $config
*/ */
public function __construct($imageRef = null, $logger = null) { public function __construct($imageRef = null, $logger = null, \OCP\IConfig $config = null) {
$this->logger = $logger; $this->logger = $logger;
if (is_null($logger)) { if (is_null($logger)) {
$this->logger = \OC::$server->getLogger(); $this->logger = \OC::$server->getLogger();
} }
$this->config = $config;
if ($config === null) {
$this->config = \OC::$server->getConfig();
}
if (\OC_Util::fileInfoLoaded()) { if (\OC_Util::fileInfoLoaded()) {
$this->fileInfo = new finfo(FILEINFO_MIME_TYPE); $this->fileInfo = new finfo(FILEINFO_MIME_TYPE);
@ -267,7 +274,7 @@ class OC_Image implements \OCP\IImage {
$retVal = imagegif($this->resource, $filePath); $retVal = imagegif($this->resource, $filePath);
break; break;
case IMAGETYPE_JPEG: case IMAGETYPE_JPEG:
$retVal = imagejpeg($this->resource, $filePath); $retVal = imagejpeg($this->resource, $filePath, $this->getJpegQuality());
break; break;
case IMAGETYPE_PNG: case IMAGETYPE_PNG:
$retVal = imagepng($this->resource, $filePath); $retVal = imagepng($this->resource, $filePath);
@ -319,7 +326,12 @@ class OC_Image implements \OCP\IImage {
$res = imagepng($this->resource); $res = imagepng($this->resource);
break; break;
case "image/jpeg": case "image/jpeg":
$res = imagejpeg($this->resource); $quality = $this->getJpegQuality();
if ($quality !== null) {
$res = imagejpeg($this->resource, null, $quality);
} else {
$res = imagejpeg($this->resource);
}
break; break;
case "image/gif": case "image/gif":
$res = imagegif($this->resource); $res = imagegif($this->resource);
@ -342,6 +354,17 @@ class OC_Image implements \OCP\IImage {
return base64_encode($this->data()); return base64_encode($this->data());
} }
/**
* @return int|null
*/
protected function getJpegQuality() {
$quality = $this->config->getAppValue('preview', 'jpeg_quality', 90);
if ($quality !== null) {
$quality = min(100, max(10, (int) $quality));
}
return $quality;
}
/** /**
* (I'm open for suggestions on better method name ;) * (I'm open for suggestions on better method name ;)
* Get the orientation based on EXIF data. * Get the orientation based on EXIF data.

View File

@ -9,6 +9,7 @@
namespace Test; namespace Test;
use OC; use OC;
use OCP\IConfig;
class ImageTest extends \Test\TestCase { class ImageTest extends \Test\TestCase {
public static function tearDownAfterClass() { public static function tearDownAfterClass() {
@ -133,7 +134,12 @@ class ImageTest extends \Test\TestCase {
$expected = ob_get_clean(); $expected = ob_get_clean();
$this->assertEquals($expected, $img->data()); $this->assertEquals($expected, $img->data());
$img = new \OC_Image(OC::$SERVERROOT.'/tests/data/testimage.jpg'); $config = $this->createMock(IConfig::class);
$config->expects($this->once())
->method('getAppValue')
->with('preview', 'jpeg_quality', 90)
->willReturn(null);
$img = new \OC_Image(OC::$SERVERROOT.'/tests/data/testimage.jpg', null, $config);
$raw = imagecreatefromstring(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $raw = imagecreatefromstring(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg'));
ob_start(); ob_start();
imagejpeg($raw); imagejpeg($raw);