1
0
mirror of https://github.com/Intervention/image.git synced 2025-08-30 01:00:06 +02:00

Add encoding shortcut methods

This commit is contained in:
Oliver Vogel
2023-11-26 13:37:32 +01:00
parent 5889391fc8
commit 01b819c845
2 changed files with 432 additions and 1 deletions

View File

@@ -11,6 +11,12 @@ use Intervention\Image\Analyzers\PixelColorsAnalyzer;
use Intervention\Image\Analyzers\ProfileAnalyzer; use Intervention\Image\Analyzers\ProfileAnalyzer;
use Intervention\Image\Analyzers\ResolutionAnalyzer; use Intervention\Image\Analyzers\ResolutionAnalyzer;
use Intervention\Image\Analyzers\WidthAnalyzer; use Intervention\Image\Analyzers\WidthAnalyzer;
use Intervention\Image\Encoders\AvifEncoder;
use Intervention\Image\Encoders\BmpEncoder;
use Intervention\Image\Encoders\GifEncoder;
use Intervention\Image\Encoders\JpegEncoder;
use Intervention\Image\Encoders\PngEncoder;
use Intervention\Image\Encoders\WebpEncoder;
use Intervention\Image\Geometry\Point; use Intervention\Image\Geometry\Point;
use Intervention\Image\Geometry\Rectangle; use Intervention\Image\Geometry\Rectangle;
use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\AnalyzerInterface;
@@ -19,6 +25,7 @@ use Intervention\Image\Interfaces\ColorInterface;
use Intervention\Image\Interfaces\ColorspaceInterface; use Intervention\Image\Interfaces\ColorspaceInterface;
use Intervention\Image\Interfaces\CoreInterface; use Intervention\Image\Interfaces\CoreInterface;
use Intervention\Image\Interfaces\DriverInterface; use Intervention\Image\Interfaces\DriverInterface;
use Intervention\Image\Interfaces\EncodedImageInterface;
use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\EncoderInterface;
use Intervention\Image\Interfaces\FontInterface; use Intervention\Image\Interfaces\FontInterface;
use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ImageInterface;
@@ -26,12 +33,30 @@ use Intervention\Image\Interfaces\ModifierInterface;
use Intervention\Image\Interfaces\ProfileInterface; use Intervention\Image\Interfaces\ProfileInterface;
use Intervention\Image\Interfaces\ResolutionInterface; use Intervention\Image\Interfaces\ResolutionInterface;
use Intervention\Image\Interfaces\SizeInterface; use Intervention\Image\Interfaces\SizeInterface;
use Intervention\Image\Modifiers\BlurModifier;
use Intervention\Image\Modifiers\BrightnessModifier;
use Intervention\Image\Modifiers\ColorizeModifier;
use Intervention\Image\Modifiers\ColorspaceModifier; use Intervention\Image\Modifiers\ColorspaceModifier;
use Intervention\Image\Modifiers\ContrastModifier;
use Intervention\Image\Modifiers\CropModifier;
use Intervention\Image\Modifiers\FitDownModifier;
use Intervention\Image\Modifiers\FitModifier;
use Intervention\Image\Modifiers\FlipModifier;
use Intervention\Image\Modifiers\FlopModifier;
use Intervention\Image\Modifiers\GammaModifier;
use Intervention\Image\Modifiers\GreyscaleModifier; use Intervention\Image\Modifiers\GreyscaleModifier;
use Intervention\Image\Modifiers\InvertModifier;
use Intervention\Image\Modifiers\PadModifier;
use Intervention\Image\Modifiers\PixelateModifier; use Intervention\Image\Modifiers\PixelateModifier;
use Intervention\Image\Modifiers\PlaceModifier;
use Intervention\Image\Modifiers\ProfileModifier; use Intervention\Image\Modifiers\ProfileModifier;
use Intervention\Image\Modifiers\RemoveAnimationModifier;
use Intervention\Image\Modifiers\ResizeDownModifier;
use Intervention\Image\Modifiers\ResizeModifier;
use Intervention\Image\Modifiers\ResolutionModifier; use Intervention\Image\Modifiers\ResolutionModifier;
use Intervention\Image\Modifiers\RotateModifier; use Intervention\Image\Modifiers\RotateModifier;
use Intervention\Image\Modifiers\ScaleDownModifier;
use Intervention\Image\Modifiers\ScaleModifier;
use Intervention\Image\Modifiers\SharpenModifier; use Intervention\Image\Modifiers\SharpenModifier;
use Intervention\Image\Modifiers\TextModifier; use Intervention\Image\Modifiers\TextModifier;
use Intervention\Image\Typography\FontFactory; use Intervention\Image\Typography\FontFactory;
@@ -70,6 +95,11 @@ class Image implements ImageInterface, Countable
return $this->count() > 1; return $this->count() > 1;
} }
public function removeAnimation(int|string $position = 0): ImageInterface
{
return $this->modify(new RemoveAnimationModifier($position));
}
public function loops(): int public function loops(): int
{ {
return $this->core->loops(); return $this->core->loops();
@@ -155,6 +185,11 @@ class Image implements ImageInterface, Countable
return $this->modify(new SharpenModifier($amount)); return $this->modify(new SharpenModifier($amount));
} }
public function invert(): ImageInterface
{
return $this->modify(new InvertModifier());
}
public function pixelate(int $size): ImageInterface public function pixelate(int $size): ImageInterface
{ {
return $this->modify(new PixelateModifier($size)); return $this->modify(new PixelateModifier($size));
@@ -165,6 +200,41 @@ class Image implements ImageInterface, Countable
return $this->modify(new GreyscaleModifier()); return $this->modify(new GreyscaleModifier());
} }
public function brightness(int $level): ImageInterface
{
return $this->modify(new BrightnessModifier($level));
}
public function contrast(int $level): ImageInterface
{
return $this->modify(new ContrastModifier($level));
}
public function gamma(float $gamma): ImageInterface
{
return $this->modify(new GammaModifier($gamma));
}
public function colorize(int $red = 0, int $green = 0, int $blue = 0): ImageInterface
{
return $this->modify(new ColorizeModifier($red, $green, $blue));
}
public function flip(): ImageInterface
{
return $this->modify(new FlipModifier());
}
public function flop(): ImageInterface
{
return $this->modify(new FlopModifier());
}
public function blur(int $amount = 5): ImageInterface
{
return $this->modify(new BlurModifier($amount));
}
public function rotate(float $angle, mixed $background = 'ffffff'): ImageInterface public function rotate(float $angle, mixed $background = 'ffffff'): ImageInterface
{ {
return $this->modify(new RotateModifier($angle, $background)); return $this->modify(new RotateModifier($angle, $background));
@@ -180,4 +250,111 @@ class Image implements ImageInterface, Countable
), ),
); );
} }
public function toJpeg(int $quality = 75): EncodedImageInterface
{
return $this->encode(new JpegEncoder($quality));
}
public function resize(?int $width, ?int $height): ImageInterface
{
return $this->modify(new ResizeModifier($width, $height));
}
public function resizeDown(?int $width, ?int $height): ImageInterface
{
return $this->modify(new ResizeDownModifier($width, $height));
}
public function scale(?int $width, ?int $height): ImageInterface
{
return $this->modify(new ScaleModifier($width, $height));
}
public function scaleDown(?int $width, ?int $height): ImageInterface
{
return $this->modify(new ScaleDownModifier($width, $height));
}
public function fit(int $width, int $height, string $position = 'center'): ImageInterface
{
return $this->modify(new FitModifier($width, $height, $position));
}
public function fitDown(int $width, int $height, string $position = 'center'): ImageInterface
{
return $this->modify(new FitDownModifier($width, $height, $position));
}
public function pad(
int $width,
int $height,
mixed $background = 'ffffff',
string $position = 'center'
): ImageInterface {
return $this->modify(new PadModifier($width, $height, $background, $position));
}
public function padDown(
int $width,
int $height,
mixed $background = 'ffffff',
string $position = 'center'
): ImageInterface {
return $this->modify(new PadModifier($width, $height, $background, $position));
}
public function crop(
int $width,
int $height,
int $offset_x = 0,
int $offset_y = 0,
string $position = 'top-left'
): ImageInterface {
return $this->modify(new CropModifier($width, $height, $offset_x, $offset_y, $position));
}
public function place(
mixed $element,
string $position = 'top-left',
int $offset_x = 0,
int $offset_y = 0
): ImageInterface {
return $this->modify(new PlaceModifier($element, $position, $offset_x, $offset_y));
}
public function toJpg(int $quality = 75): EncodedImageInterface
{
return $this->toJpeg($quality);
}
public function toPng(int $color_limit = 0): EncodedImageInterface
{
return $this->encode(new PngEncoder($color_limit));
}
public function toGif(int $color_limit = 0): EncodedImageInterface
{
return $this->encode(new GifEncoder($color_limit));
}
public function toWebp(int $quality = 75): EncodedImageInterface
{
return $this->encode(new WebpEncoder($quality));
}
public function toBitmap(int $color_limit = 0): EncodedImageInterface
{
return $this->encode(new BmpEncoder($color_limit));
}
public function toBmp(int $color_limit = 0): EncodedImageInterface
{
return $this->toBitmap($color_limit);
}
public function toAvif(int $quality = 75): EncodedImageInterface
{
return $this->encode(new AvifEncoder($quality));
}
} }

View File

@@ -4,7 +4,6 @@ namespace Intervention\Image\Interfaces;
use Countable; use Countable;
use Intervention\Image\EncodedImage; use Intervention\Image\EncodedImage;
use Intervention\Image\Modifiers\ColorspaceModifier;
use IteratorAggregate; use IteratorAggregate;
interface ImageInterface extends IteratorAggregate, Countable interface ImageInterface extends IteratorAggregate, Countable
@@ -75,6 +74,19 @@ interface ImageInterface extends IteratorAggregate, Countable
*/ */
public function isAnimated(): bool; public function isAnimated(): bool;
/**
* Remove all frames but keep the one at the specified position
*
* It is possible to specify the position as integer or string values.
* With the former, the exact position passed is searched for, while
* string values must represent a percentage value between '0%' and '100%'
* and the respective frame position is only determined approximately.
*
* @param int|string $position
* @return ImageInterface
*/
public function removeAnimation(int|string $position = 0): ImageInterface;
/** /**
* Return loop count of animated image * Return loop count of animated image
* *
@@ -170,6 +182,69 @@ interface ImageInterface extends IteratorAggregate, Countable
*/ */
public function greyscale(): ImageInterface; public function greyscale(): ImageInterface;
/**
* Adjust brightness of the current image
*
* @param int $level
* @return ImageInterface
*/
public function brightness(int $level): ImageInterface;
/**
* Adjust color contrast of the current image
*
* @param int $level
* @return ImageInterface
*/
public function contrast(int $level): ImageInterface;
/**
* Apply gamma correction on the current image
*
* @param float $gamma
* @return ImageInterface
*/
public function gamma(float $gamma): ImageInterface;
/**
* Adjust the intensity of the RGB color channels
*
* @param int $red
* @param int $green
* @param int $blue
* @return ImageInterface
*/
public function colorize(int $red = 0, int $green = 0, int $blue = 0): ImageInterface;
/**
* Mirror the current image horizontally
*
* @return ImageInterface
*/
public function flip(): ImageInterface;
/**
* Mirror the current image vertically
*
* @return ImageInterface
*/
public function flop(): ImageInterface;
/**
* Blur current image by given strength
*
* @param int $amount
* @return ImageInterface
*/
public function blur(int $amount = 5): ImageInterface;
/**
* Invert the colors of the current image
*
* @return ImageInterface
*/
public function invert(): ImageInterface;
/** /**
* Apply pixelation filter effect on current image * Apply pixelation filter effect on current image
* *
@@ -197,4 +272,183 @@ interface ImageInterface extends IteratorAggregate, Countable
* @return ImageInterface * @return ImageInterface
*/ */
public function text(string $text, int $x, int $y, callable|FontInterface $font): ImageInterface; public function text(string $text, int $x, int $y, callable|FontInterface $font): ImageInterface;
/**
* Resize image to the given width and/or height
*
* @param null|int $width
* @param null|int $height
* @return ImageInterface
*/
public function resize(?int $width, ?int $height): ImageInterface;
/**
* Resize image to the given width and/or height without exceeding the original dimensions
*
* @param null|int $width
* @param null|int $height
* @return ImageInterface
*/
public function resizeDown(?int $width, ?int $height): ImageInterface;
/**
* Resize image to the given width and/or height and keep the original aspect ratio
*
* @param null|int $width
* @param null|int $height
* @return ImageInterface
*/
public function scale(?int $width, ?int $height): ImageInterface;
/**
* Resize image to the given width and/or height, keep the original aspect ratio
* and do not exceed the original image width or height
*
* @param null|int $width
* @param null|int $height
* @return ImageInterface
*/
public function scaleDown(?int $width, ?int $height): ImageInterface;
/**
* Takes the given dimensions and scales it to the largest possible size matching
* the original size. Then this size is positioned on the original and cut out
* before being resized to the desired size from the arguments
*
* @param int $width
* @param int $height
* @param string $position
* @return ImageInterface
*/
public function fit(int $width, int $height, string $position = 'center'): ImageInterface;
/**
* Same as fit() but do not exceed the original image size
*
* @param int $width
* @param int $height
* @param string $position
* @return ImageInterface
*/
public function fitDown(int $width, int $height, string $position = 'center'): ImageInterface;
/**
* Padded resizing means that the original image is scaled until it fits the
* defined target size with unchanged aspect ratio. Compared to the fit()
* method, this call does not create cropped areas, but new empty areas
* on the sides of the result image. These are filled with the specified
* background color.
*
* @param int $width
* @param int $height
* @param string $background
* @param string $position
* @return ImageInterface
*/
public function pad(
int $width,
int $height,
mixed $background = 'ffffff',
string $position = 'center',
): ImageInterface;
/**
* This method does the same thing as pad() but does not exceed the size of
* the original image. You can use this if you want to prevent up-sampling.
*
* @param int $width
* @param int $height
* @param string $background
* @param string $position
* @return ImageInterface
*/
public function padDown(
int $width,
int $height,
mixed $background = 'ffffff',
string $position = 'center',
): ImageInterface;
/**
* Cut out a rectangular part of the current image with given width and height at a given position.
* Define optional x,y offset coordinates to move the cutout by the given amount of pixels.
*
* @param int $width
* @param int $height
* @param int $offset_x
* @param int $offset_y
* @param string $position
* @return ImageInterface
*/
public function crop(
int $width,
int $height,
int $offset_x = 0,
int $offset_y = 0,
string $position = 'top-left',
): ImageInterface;
/**
* Place another image into the current image instance
*
* @param mixed $element
* @param string $position
* @param int $offset_x
* @param int $offset_y
* @return ImageInterface
*/
public function place(
mixed $element,
string $position = 'top-left',
int $offset_x = 0,
int $offset_y = 0
): ImageInterface;
/**
* Encode image to JPEG format
*
* @param int $quality
* @return EncodedImageInterface
*/
public function toJpeg(int $quality = 75): EncodedImageInterface;
/**
* Encode image to Webp format
*
* @param int $quality
* @return EncodedImageInterface
*/
public function toWebp(int $quality = 75): EncodedImageInterface;
/**
* Encode image to PNG format
*
* @param int $color_limit
* @return EncodedImageInterface
*/
public function toPng(int $color_limit = 0): EncodedImageInterface;
/**
* Encode image to GIF format
*
* @param int $color_limit
* @return EncodedImageInterface
*/
public function toGif(int $color_limit = 0): EncodedImageInterface;
/**
* Encode image to Bitmap format
*
* @param int $color_limit
* @return EncodedImageInterface
*/
public function toBitmap(int $color_limit = 0): EncodedImageInterface;
/**
* Encode image to AVIF format
*
* @param int $quality
* @return EncodedImageInterface
*/
public function toAvif(int $quality = 75): EncodedImageInterface;
} }