From 4374d159317507e92401f6ddc58b7c2e78cd16d7 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Tue, 23 Aug 2022 20:21:00 +0200 Subject: [PATCH] Add encoders for MS Windows Bitmap format (BMP) --- src/Drivers/Abstract/AbstractImage.php | 12 +++++++ src/Drivers/Gd/Encoders/BmpEncoder.php | 20 +++++++++++ src/Drivers/Imagick/Encoders/BmpEncoder.php | 26 ++++++++++++++ tests/Drivers/Gd/Encoders/BmpEncoderTest.php | 33 +++++++++++++++++ .../Imagick/Encoders/BmpEncoderTest.php | 36 +++++++++++++++++++ 5 files changed, 127 insertions(+) create mode 100644 src/Drivers/Gd/Encoders/BmpEncoder.php create mode 100644 src/Drivers/Imagick/Encoders/BmpEncoder.php create mode 100644 tests/Drivers/Gd/Encoders/BmpEncoderTest.php create mode 100644 tests/Drivers/Imagick/Encoders/BmpEncoderTest.php diff --git a/src/Drivers/Abstract/AbstractImage.php b/src/Drivers/Abstract/AbstractImage.php index fc2d6aad..1bd0f078 100644 --- a/src/Drivers/Abstract/AbstractImage.php +++ b/src/Drivers/Abstract/AbstractImage.php @@ -82,6 +82,18 @@ abstract class AbstractImage implements ImageInterface ); } + public function toBitmap(): EncodedImage + { + return $this->encode( + $this->resolveDriverClass('Encoders\BmpEncoder') + ); + } + + public function toBmp(): EncodedImage + { + return $this->toBitmap(); + } + public function greyscale(): ImageInterface { return $this->modify( diff --git a/src/Drivers/Gd/Encoders/BmpEncoder.php b/src/Drivers/Gd/Encoders/BmpEncoder.php new file mode 100644 index 00000000..422c8b5b --- /dev/null +++ b/src/Drivers/Gd/Encoders/BmpEncoder.php @@ -0,0 +1,20 @@ +getBuffered(function () use ($image) { + imagebmp($image->getFrame()->getCore(), null, false); + }); + + return new EncodedImage($data, 'image/bmp'); + } +} diff --git a/src/Drivers/Imagick/Encoders/BmpEncoder.php b/src/Drivers/Imagick/Encoders/BmpEncoder.php new file mode 100644 index 00000000..6f6bd932 --- /dev/null +++ b/src/Drivers/Imagick/Encoders/BmpEncoder.php @@ -0,0 +1,26 @@ +getFrame()->getCore(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + + return new EncodedImage($imagick->getImagesBlob(), 'image/bmp'); + } +} diff --git a/tests/Drivers/Gd/Encoders/BmpEncoderTest.php b/tests/Drivers/Gd/Encoders/BmpEncoderTest.php new file mode 100644 index 00000000..d5e2480d --- /dev/null +++ b/tests/Drivers/Gd/Encoders/BmpEncoderTest.php @@ -0,0 +1,33 @@ +getTestImage(); + $encoder = new BmpEncoder(); + $result = $encoder->encode($image); + $this->assertTrue(MimeSniffer::createFromString($result)->matches(new ImageBmp)); + } +} diff --git a/tests/Drivers/Imagick/Encoders/BmpEncoderTest.php b/tests/Drivers/Imagick/Encoders/BmpEncoderTest.php new file mode 100644 index 00000000..2ae1dd51 --- /dev/null +++ b/tests/Drivers/Imagick/Encoders/BmpEncoderTest.php @@ -0,0 +1,36 @@ +newImage(3, 2, new ImagickPixel('red'), 'png'); + + return new Image($imagick); + } + + public function testEncode(): void + { + $image = $this->getTestImage(); + $encoder = new BmpEncoder(); + $result = $encoder->encode($image); + $this->assertTrue( + MimeSniffer::createFromString($result)->matches(new ImageBmp()) + ); + } +}