PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.4
Independent Analytics – WordPress Analytics Plugin v2.15.4
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 / GraphicsDriverConverter.php
independent-analytics / IAWP / Favicon / Converter Last commit date
AbstractConverter.php 6 months ago GraphicsDriverConverter.php 6 months ago ImagickConverter.php 6 months ago
GraphicsDriverConverter.php
70 lines
1 <?php
2
3 namespace IAWP\Favicon\Converter;
4
5 /** @internal */
6 class GraphicsDriverConverter extends \IAWP\Favicon\Converter\AbstractConverter
7 {
8 public const MAX_DIMENSION = 3000;
9 public function save()
10 {
11 try {
12 $blob = $this->blob;
13 $path = $this->path;
14 $info = \getimagesizefromstring($blob);
15 if ($info === \false) {
16 return \false;
17 }
18 list($width, $height, $type) = $info;
19 $allowedTypes = [\IMAGETYPE_JPEG, \IMAGETYPE_PNG, \IMAGETYPE_GIF, \IMAGETYPE_WEBP];
20 if (!\in_array($type, $allowedTypes)) {
21 return \false;
22 }
23 // Image is too large to safely process
24 if ($width > self::MAX_DIMENSION || $height > self::MAX_DIMENSION) {
25 return \false;
26 }
27 $image = \imagecreatefromstring($blob);
28 if ($image === \false) {
29 return \false;
30 }
31 $max_size = 48;
32 $new_width = $width;
33 $new_height = $height;
34 if ($width > $max_size || $height > $max_size) {
35 if ($width > $height) {
36 $new_width = $max_size;
37 $new_height = (int) \round($height * ($max_size / $width));
38 } else {
39 $new_height = $max_size;
40 $new_width = (int) \round($width * ($max_size / $height));
41 }
42 }
43 $thumbnail_size = \min($new_width, $new_height);
44 // First resize the image
45 $resized = \imagecreatetruecolor($new_width, $new_height);
46 \imagealphablending($resized, \false);
47 \imagesavealpha($resized, \true);
48 $transparent = \imagecolorallocatealpha($resized, 0, 0, 0, 127);
49 \imagefill($resized, 0, 0, $transparent);
50 \imagecopyresampled($resized, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
51 // Then crop to square
52 $final = \imagecreatetruecolor($thumbnail_size, $thumbnail_size);
53 \imagealphablending($final, \false);
54 \imagesavealpha($final, \true);
55 $transparent = \imagecolorallocatealpha($final, 0, 0, 0, 127);
56 \imagefill($final, 0, 0, $transparent);
57 $src_x = (int) \round(($new_width - $thumbnail_size) / 2);
58 $src_y = (int) \round(($new_height - $thumbnail_size) / 2);
59 \imagecopy($final, $resized, 0, 0, $src_x, $src_y, $thumbnail_size, $thumbnail_size);
60 // Save as PNG
61 $result = \imagepng($final, $path);
62 // Clean up
63 \imagedestroy($image);
64 \imagedestroy($resized);
65 \imagedestroy($final);
66 } catch (\Throwable $e) {
67 }
68 }
69 }
70