使用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 将 ICO 转换为 PNG 的问题

PHP Imagick 将 JPG 转换为 PNG 并删除背景作品但并不完美

ImageMagick/Imagick 使用原生 PHP API 将 PDF 转换为 JPG

用php为imagick设置密度参数

如何使用 Python 将 .ICO 转换为 .PNG?

在 xampp Windows 上安装 imagick 库扩展?