В настоящее время я пытаюсь преобразовать файл ICO в PNG размером 16x16 пикселей, используя PHP -Imagick. Что я пробовал до сих пор:
<?php
if (empty(\Imagick::queryFormats("ICO"))) {
throw new \Exception('Unsupported format');
}
$sourceFile = __DIR__ . '/favicon.ico';
$targetFile = __DIR__ . '/favicon.png';
$im = new \Imagick($sourceFile);
$im->writeImages($targetFile, true);
Это работает частично. Проблема в том, что файл ICO может содержать несколько изображений, поэтому приведенный выше код создает несколько файлов PNG
- favicon-0.png
- favicon-1.png
- ...
для каждого размера. Это нормально, но тогда мне нужна возможность найти тот, который близок к 16x16 пикселей, уменьшить его (при необходимости) и удалить все остальные. Для этого я уже попробовал некоторые вещи, и вот где я застрял:
<?php
if (empty(\Imagick::queryFormats("ICO"))) {
throw new \Exception('Unsupported format');
}
$sourceFile = __DIR__ . '/favicon.ico';
$targetFile = __DIR__ . '/favicon.png';
$im = new \Imagick($sourceFile);
$count = $im->getNumberImages();
if ($count > 1) {
for ($x = 1; $x <= $count; $x++) {
$im->previousImage();
$tmpImageWidth = $im->getImageWidth();
$tmpImageHeight = $im->getImageHeight();
// ???
}
}
$im->writeImages($targetFile, true);
Думаю, я бы нашел способ работы с некоторыми пробами и ошибками. Но я хотел бы знать, есть ли более простой способ добиться этого.
TL; DR: мне нужен простой способ конвертировать файл ICO любого размера в PNG размером 16x16 пикселей, используя PHP - Imagick (использование GD не вариант).
Обновление:
Мое (в настоящее время работает, но, возможно, неоптимальное) решение:
<?php
if (empty(\Imagick::queryFormats("ICO"))) {
throw new \Exception('Unsupported format');
}
$sourceFile = __DIR__ . '/favicon.ico';
$targetFile = __DIR__ . '/favicon.png';
$im = new \Imagick($sourceFile);
$count = $im->getNumberImages();
$targetWidth = $targetHeight = 16;
if ($count > 1) {
$images = [];
for ($x = 1; $x <= $count; $x++) {
$im->previousImage();
$images[] = [
'object' => $im,
'size' => $im->getImageWidth() + $im->getImageHeight()
];
}
$minSize = min(array_column($images, 'size'));
$image = array_values(array_filter($images, function($image) use ($minSize) {
return $minSize === $image['size'];
}))[0];
$im = $image['object'];
if ($image['size'] <> $targetWidth + $targetHeight) {
$im->cropThumbnailImage($targetWidth, $targetHeight);
}
}
else {
if ($im->getImageWidth() <> $targetWidth || $im->getImageHeight() <> $targetHeight) {
$im->cropThumbnailImage($targetWidth, $targetHeight);
}
}
$im->writeImage($targetFile);