【问题标题】:PHP Imagick: How to save custom image property to filePHP Imagick:如何将自定义图像属性保存到文件
【发布时间】:2016-02-16 20:58:54
【问题描述】:

我有一个 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对象,该属性就无法读取并返回false:

字符串(4)“原始”字符串(4)“原始”

布尔(假)

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

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

【问题讨论】:

  • 将属性写入 png 图像工作......它也应该适用于我认为的 jpeg......我已经打开了一个问题,github.com/mkoppanen/imagick/issues/124 并将尝试调查.. .
  • @Danack !会关注问题

标签: php codeigniter image-processing imagick


【解决方案1】:

这似乎是 ImageMagick 库和 JPEG 图像格式的限制。简短的版本是 ImageMagick 库只为 JPG 图像保留名为“comment”的属性。请参阅下面的代码以获取示例。

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'

【讨论】:

  • 感谢@danack 的研究和额外的思考。我曾考虑使用类似于您建议的文件存储,但如果/当我移动图像组时,我希望避免管理多个文件。虽然不是世界末日
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多