使用PHP Imagick将ICO转换为PNG。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用PHP Imagick将ICO转换为PNG。相关的知识,希望对你有一定的参考价值。
我目前正试图使用 php-Imagick 将一个 ICO 文件转换为 16x16 px 的 PNG。到目前为止,我已经试过了。
<?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 px的图,把它缩小(如果需要的话),然后删除所有其他图。为此,我已经尝试了一些东西,这是我目前所困的地方。
<?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文件到一个16x16 px的PNG,使用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);
更新的答案
重新阅读你的问题,看来你其实是想把ICO文件做成PNG文件。我阅读了 维基百科的ICO文件条目 而且,像往常一样,它是一个糟糕的指定复杂的混乱的闭源微软的东西。我不知道它们是按照某种顺序来的......先是最小的,还是先是最大的,所以我想我的建议是按照你的计划,简单地遍历你的ICO文件中的所有图片,然后得到像素数最多的那张,并将其调整为16x16。
原始答案
太多的评论,也许不足以回答...... 我不用PHP 想象力 但如果你用 图像魔术 在终端的命令行,你可以设置ICO的大小,如 这个:
magick INPUT -define icon:auto-resize="256,128,96,64,16" output.ico
说你想在输出文件中嵌入什么分辨率。我说过,我不用PHP,但我相信等价物是这样的。
$imagick->setOption('icon:auto-resize', "16");
对不起,我不能提供更好的帮助,我只是不知道如何使用PHP和。想象力但希望你能从这里解决。
我的最终解决方案。
<?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);
以上是关于使用PHP Imagick将ICO转换为PNG。的主要内容,如果未能解决你的问题,请参考以下文章
PHP Imagick 将 JPG 转换为 PNG 并删除背景作品但并不完美