PHP Imagick:如何将自定义图像 属性 保存到文件

PHP Imagick: How to save custom image property to file

我有一个 PHP 应用程序正在使用 Image Magick (Imagick()) 处理大量图像,并且我正在尝试将一段计算数据保存到图像中以供读取(如果可用)使用 Imagick::setImageProperty()Imagick::getImageProperty() 来节省处理时间或计算并保存以备下次使用。我在 CodeIgniter 2 中有一个测试控制器,如下所示:

class Example extends CI_Controller
{
    public function __construct()
    {
         parent::__construct();
    }

    public function property()
    {
        $im = new Imagick();
        $im->newimage(50, 50, 'blue');
        $im->setimageformat('jpg');
        $im->setimageproperty('My-App:My-Prop', 'rawr');
        var_dump($im->getimageproperty('My-App:My-Prop'));
        $im->writeimage(getcwd().'/images/test/output.jpg');
        echo '<br />'.var_dump($im->getimageproperty('My-App:My-Prop'));
        echo '<img src="/images/test/output.jpg" /><br />';

        $this->read();
    }

    public function read()
    {
        $im = new Imagick(getcwd().'/images/test/output.jpg');
        var_dump($im->getimageproperty('My-App:My-Prop'));
    }
}

属性前2次成功读取,但是一旦根据保存的图像实例化新的Imagick对象,属性就无法读取,returns false:

字符串(4) "rawr" 字符串(4) "rawr"

布尔值(假)

无法将自定义图像 属性 保存到文件中,还是我误用了 class?

PS...我故意不使用 CodeIgniter 图像库,但如果这对这种情况有帮助,我愿意接受这个想法。

这似乎是 ImageMagick 库和 JPEG 图像格式的限制。简短的版本是只有名为 'comment' 的属性才会被 ImageMagick 库保留用于 JPG 图像。有关示例,请参见下面的代码。

TBH 我认为明智的做法是将元信息与图像文件分开存储。即取图像文件名,附加“.json”并将计算的数据存储在那里。

它会工作,如果图像没有被修改,将避免重新保存图像,并且通常是比将其存储在图像文件中更可靠的解决方案。

$propertyNames = [
    "comment",
    "anything_else"
];

$formats = [
    'jpg',
    'png'
];

foreach ($formats as $format) {
    foreach ($propertyNames as $propertyName) {
        $imagick = new Imagick('./LittleRobin.jpg');
        $imagick->setImageProperty($propertyName, "Modified value");
        $imagick->setFormat($format);
        $imagick->writeImage("./testModified.".$format);
        $imagick2 = new Imagick("./testModified.".$format);
        printf(
            "After reloading '%s' property '%s' is:%s\n",
            $format,
            $propertyName,
            var_export($imagick2->getImageProperty($propertyName), true)
        );
    }
}

输出为:

After reloading 'jpg' property 'comment' is:'Modified value'
After reloading 'jpg' property 'anything_else' is:false
After reloading 'png' property 'comment' is:'Modified value'
After reloading 'png' property 'anything_else' is:'Modified value'