A tool for working with images. It can be used as an extension of the Nette Framework.
There is Image storage
for storing images easily and/or deleting them from
the storage. There are also several ways how to resize and/or process images.
Then, you can get a stored image path directly, or you can use prepared
Latte macros to generate HTML tags.
See Usage.
Requires the PHP version 8.2
or newer and PHP extensions fileinfo
, gd
,
and intl
.
Download the latest release or use Composer:
composer require harmim/images
For working with images, we need \Harmim\Images\ImageStorage
:
$customConfig = [
'wwwDir' => __DIR__ . DIRECTORY_SEPARATOR . 'www',
'compression' => 90,
'placeholder' => 'images/foo.png',
'types' => [
'img-small' => [
'width' => 50,
'height' => 50,
'transform' => \Harmim\Images\Resize::Exact,
...
],
...
],
...
];
$imageStorage = $customConfig + \Harmim\Images\Config\Config::Defaults;
In $customConfig
, you can specify a custom configuration.
See Configuration.
You can enable and customise the extension using your NEON config:
extensions:
images: \Harmim\Images\DI\ImagesExtension
images:
compression: 90
placeholder: images/foo.png
types:
img-small:
width: 50
height: 50
transform: ::constant(\Harmim\Images\Resize::Exact)
...
...
...
In the images
section, you can specify a custom configuration.
See Configuration.
\Harmim\Images\ImageStorage
is now registrated in the DI container. You can
get it directly from the container:
/** @var \Nette\DI\Container $container */
$imageStorage = $container->getService('images.imageStorage');
// or
$imageStorage = $container->getByType(\Harmim\Images\ImageStorage::class);
Of course, you can inject \Harmim\Images\ImageStorage
through a constructor,
inject method, inject annotation, or any other way.
If you want to use \Harmim\Images\ImageStorage
in a presenter or control
where inject methods are called, you can use trait
\Harmim\Images\TImageStorage
. In your presenters, controls, and theire
templates, there will be variable $imageStorage
.
abstract class BasePresenter extends \Nette\Application\UI\Presenter
{
use \Harmim\Images\TImageStorage;
}
abstract class BaseControl extends \Nette\Application\UI\Control
{
use \Harmim\Images\TImageStorage;
}
The extension installs images macros to Latte. See Macros.
You can store an image using method
\Harmim\Images\ImageStorage::saveImage(string $name, string $path): string
or
\Harmim\Images\ImageStorage::saveUpload(\Nette\Http\FileUpload $file): string
.
An original image will be stored; then, it will be compresed.
Both methods return a stored image file name. You can use this file name to delete, resize, or retrieve the image.
Images are stored with a unique file name and location.
Using method
\Harmim\Images\ImageStorage::deleteImage(string $fileName, array $excludedTypes = []): void
,
you can delete an image by $fileName
which should be a file name returned by
\Harmim\Images\ImageStorage::saveImage
or
\Harmim\Images\ImageStorage::saveUpload
.
If you pass $excludedTypes
, only other types will be deleted; otherwise, all
types, the original image, and the compressed image will be deleted.
You can get a stored image path using method
\Harmim\Images\ImageStorage::getImageLink(string $fileName, ?string $type = null, array $options = []): ?string
or Macros. You can pass a specific type defined in an inital
configuration, or you can pass specific options. See
Configuration. $fileName
should be a file name returned by
\Harmim\Images\ImageStorage::saveImage
or
\Harmim\Images\ImageStorage::saveUpload
.
If you try to get an image of a size or a type for a first time, this image is not yet created, so it will be created now. Next time, you will get a resized image.
If the image does not exist, a placeholder will be returned.
In case you need to get an original/compressed image, in the configuration,
you can use orig/compressed
, respectively. For example, ['orig' => true]
.
It is also possible to use these options in macros.
{img [$image] [image-type] [options]}
Renders the img
tag:
<img src="foo.jpg" width="100" height="100" alt="foo">
or tags for lazy loading with the lazy
option:
<img class="lazy" data-src="foo.jpg" width="100" height="100" alt="foo">
<noscript><img src="foo.jpg" width="100" height="100" alt="foo"></noscript>
Examples:
{img alt => 'foo'} {* returns a path to a placeholder *}
{* '$image' is a file name *}
{img $image alt => 'foo'}
{img $image width => 200, height => 200, alt => 'foo'}
{* 'img-small' is an image type defined in the configuration *}
{img $image img-small alt => 'foo'}
{img $image img-small compression => 90, alt => 'foo', class => 'bar'}
{img $image img-small lazy => true, alt => 'foo'}
{img $image img-small lazy => true, width => 500, height => 650, alt => 'foo'}
<img n:img="[$image] [image-type] [options]" alt="foo">
Renders the src
attribute. It can be used, e.g., in the img
element.
Examples:
<img n:img alt="foo"> {* renders a path to a placeholder *}
{* '$image' is a file name *}
<img n:img="$image" alt="foo">
<img n:img="$image width => 200, height => 200" width="200" height="200"
alt="foo">
{* 'img-small' is an image type defined in the configuration *}
<img n:img="$image img-small" alt="foo">
<img n:img="$image img-small compression => 90" alt="foo" class="bar">
{imgLink [$image] [image-type] [options]}
Returns a relative path (from the resource root directory) to a given image.
Examples:
{imgLink} {* returns a path to a placeholder *}
{* '$image' is a file name *}
{imgLink $image}
{imgLink $image width => 200, height => 200}
{* 'img-small' is an image type defined in the configuration *}
{imgLink $image img-small}
{imgLink $image img-small compression => 90}
<div class="image-box" data-src="{imgLink $image img-small}}"></div>
wwwDir
: (string
) An absolute path to the resource root directory.- Default:
%wwwDir%
in Nette; otherwise, you have to specify this parameter.
- Default:
imagesDir
: (string
) A relative path (fromwwwDir
) to a directory for storing images.- Default:
data/images
.
- Default:
origDir
: (string
) A relative path (fromimagesDir
) to a directory for storing original images.- Default:
orig
.
- Default:
compressionDir
: (string
) A relative path (fromimagesDir
) to a directory for storing compressed images.- Default:
imgs
.
- Default:
placeholder
: (string
) A relative path (fromwwwDir
) to an image placeholder (when an image is not found).- Default:
img/noimg.jpg
.
- Default:
width
: (int
) An image width.- Default:
1024
.
- Default:
height
: (int
) An image height.- Default:
1024
.
- Default:
compression
: (int
) A compression quality. See\Nette\Utils\Image::save
.- Default:
85
.
- Default:
transform
: (\Harmim\Images\Resize|list<\Harmim\Images\Resize>
) See Transform-Options.- Default:
\Harmim\Images\Resize::OrSmaller
.
- Default:
allowedImgTagAttrs
: (list<string>
)img
attributes you can use in the{img}
Latte macro, other attributes are ignored.- Default:
[alt, height, width, class, hidden, id, style, title, data]
.
- Default:
lazy
: (bool
) Render the{img}
Latte macro as a lazy image (with thedata-src
attribute,lazy
class, and normalimg
tag in thenoscript
tag).- Default:
false
.
- Default:
types
: (array<string, mixed>
) A configuration for image types overriding the default configuration.- Default:
[]
. - Example:
- Default:
types:
img-small:
width: 50
height: 50
img-gallery:
lazy: true
transform:
- ::constant(\Harmim\Images\Resize::Stretch)
- ::constant(\Harmim\Images\Resize::Cover)
destDir
: (?string
) A directory where to find images.- Default:
null
.
- Default:
orig
: (?bool
) When set totrue
, the original image will be returned.- Default:
null
.
- Default:
compressed
: (?bool
) When set totrue
, the original compressed image will be returned.- Default:
null
.
- Default:
Option | Description |
---|---|
\Harmim\Images\Resize::ShrinkOnly |
Only shrinking (prevents a small image from being stretched). |
\Harmim\Images\Resize::Stretch |
Do not keep the aspect ratio. |
\Harmim\Images\Resize::OrSmaller |
The resulting dimensions will be smaller or equal to the required dimensions. |
\Harmim\Images\Resize::OrBigger |
Fills (and possibly exceeds in one dimension) the target area. |
\Harmim\Images\Resize::Cover |
Fills the target area and cuts off what goes beyond. |
\Harmim\Images\Resize::Exact |
Placees a not stretched image to the exact blank area. |
This tool is licensed under the MIT license.
Author: Dominik Harmim <[email protected]>