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'
我有一个 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'