. // }}} namespace Plugin\ImageThumbnail; use App\Core\Event; use function App\Core\I18n\_m; use App\Core\Modules\Module; use App\Core\Router\RouteLoader; use App\Entity\Attachment; use App\Entity\AttachmentThumbnail; use App\Util\Common; use Jcupitt\Vips; class ImageThumbnail extends Module { public function onAddRoute(RouteLoader $r) { $r->connect('thumbnail', '/thumbnail/{id<\d+>}', [Controller\ImageThumbnail::class, 'thumbnail']); return Event::next; } /** * Resizes an image. It will reencode the image in the * `self::prefferedType()` format. This only applies henceforward, * not retroactively * * Increases the 'memory_limit' to the one in the 'attachments' section in the config, to * enable the handling of bigger images, which can cause a peak of memory consumption, while * encoding * * @throws Exception */ public function onResizeImage(Attachment $attachment, AttachmentThumbnail $thumbnail, int $width, int $height, bool $crop) { $old_limit = ini_set('memory_limit', Common::config('attachments', 'memory_limit')); try { // -1 means load all pages, 'sequential' access means decode pixels on demand // $image = Vips\Image::newFromFile(self::getPath($attachment), ['n' => -1, 'access' => 'sequential']); $image = Vips\Image::thumbnail($attachment->getPath(), $width, ['height' => $height]); } catch (Exception $e) { Log::error(__METHOD__ . ' encountered exception: ' . print_r($e, true)); // TRANS: Exception thrown when trying to resize an unknown file type. throw new Exception(_m('Unknown file type')); } if ($attachment->getPath() === $thumbnail->getPath()) { @unlink($thumbnail->getPath()); } $image->writeToFile($thumbnail->getPath()); unset($image); ini_set('memory_limit', $old_limit); // Restore the old memory limit return Event::next; } }