PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.5
Independent Analytics – WordPress Analytics Plugin v2.15.5
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Favicon / Converter / ImagickConverter.php
independent-analytics / IAWP / Favicon / Converter Last commit date
AbstractConverter.php 6 months ago GraphicsDriverConverter.php 6 months ago ImagickConverter.php 6 months ago
ImagickConverter.php
58 lines
1 <?php
2
3 namespace IAWP\Favicon\Converter;
4
5 /** @internal */
6 class ImagickConverter extends \IAWP\Favicon\Converter\AbstractConverter
7 {
8 public function save()
9 {
10 try {
11 $blob = $this->blob;
12 $path = $this->path;
13 $imagick = new \Imagick();
14 $imagick->setResourceLimit(\Imagick::RESOURCETYPE_MEMORY, 128 * 1024 * 1024);
15 // 128MB
16 $imagick->setResourceLimit(\Imagick::RESOURCETYPE_AREA, 4000 * 4000);
17 // 16MP limit
18 $imagick->setOption('svg:decode-entities', 'false');
19 try {
20 $imagick->readImageBlob($blob);
21 } catch (\Throwable $e) {
22 // Retry with ICO format if initial read fails (common for some ICO files)
23 $imagick = new \Imagick();
24 $imagick->setFormat('ico');
25 $imagick->readImageBlob($blob);
26 }
27 // Handle multi-frame files (like ICO) by selecting the best frame
28 if ($imagick->getNumberImages() > 1) {
29 $bestIndex = 0;
30 $maxArea = 0;
31 $numImages = $imagick->getNumberImages();
32 for ($i = 0; $i < $numImages; $i++) {
33 $imagick->setIteratorIndex($i);
34 $area = $imagick->getImageWidth() * $imagick->getImageHeight();
35 if ($area > $maxArea) {
36 $maxArea = $area;
37 $bestIndex = $i;
38 }
39 }
40 $imagick->setIteratorIndex($bestIndex);
41 $image = $imagick->getImage();
42 $imagick->clear();
43 $imagick = $image;
44 }
45 $imagick->stripImage();
46 $imagick->setImageFormat('png');
47 $imagick->thumbnailImage(48, 48, \true);
48 $thumbnail_size = \min($imagick->getImageWidth(), $imagick->getImageHeight());
49 $imagick->cropThumbnailImage($thumbnail_size, $thumbnail_size);
50 $imagick->writeImage($path);
51 $imagick->clear();
52 $imagick->destroy();
53 } catch (\Throwable $e) {
54 // ...
55 }
56 }
57 }
58