我有一个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'));
}
}
该属性已成功成功读取了两次,但是一旦Imagick
基于保存的图像实例化了一个新对象,该属性将无法读取并返回false
:
字符串(4)“原始”字符串(4)“原始”
布尔值(false)
是否无法将自定义图像属性保存到文件,还是我滥用该类?
PS ...我故意不使用CodeIgniter图像库,但是如果在这种情况下可以提供帮助,则可以接受该想法。
这似乎是ImageMagick库和JPEG图像格式的限制。简短的版本是ImageMagick库仅保留名为“ comment”的属性来存储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'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句