如何用PHP存储图像中的数据?

时间:2018-02-04 21:49:45

标签: php image-processing imagick

我尝试使用imagick库创建两个这样的函数:

function storeCoordinatesImage($img_path, $coordinates){
    $im = new imagick($img_path);
    $im->setImageProperty("coords", $coordinates);
    $im->writeImage($img_path);
}

function getCoordinatesImage($img_path){
    $im = new imagick($img_path);
    return $im->getImageProperty("coords");
}

如果我跑:

if(!storeCoordinatesImage("I.jpg", "hi")) echo "fal";
echo getCoordinatesImage("I.jpg");

什么都没有。

但如果我跑:

$im = new imagick($img_path);
$im->setImageProperty("coords", "hello");
echo $im->getImageProperty("coords");

它返回“你好”。

因此写入图像一定是个问题吗?虽然这些函数都没有返回false。 (即他们都在工作)

3 个答案:

答案 0 :(得分:3)

使用图像的配置文件有效负载来存储任意数据。虽然存储在图像注释(即JPG_COM)标签中的JSON有效载荷似乎很容易,但是这个提议存在几种竞争技术。最受欢迎的是,但我建议

可扩展元数据平台

在我看来,xmp似乎过度设计,但确实提供了一个平台,以确保所有供应商专有信息都通过XML命名空间分开。

维基百科有一个great overview,Adobe的白皮书(pdf)做得很好,概述了供应商实施的“做什么不做”。

ImageMagick不处理读/写配置文件有效负载之外的任何内容,因此您将负责实现XML管理器。

例如......

// A minimal XMP tempalte
$XMP_BASE='<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMPTk 2.8">'
         .'<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"></rdf:RDF>'
         .'</x:xmpmeta>';

$xmp = new DOMDocument();
$xmp->loadXML($XMP_BASE);
// Create a <rdf:Descriptiom> & <Coords> DOM element.
foreach($xmp->getElementsByTagName('RDF') as $node) {
    $coords = $xmp->createElement('Coords', 'hello');
    $description = $xmp->createElement('rdf:Description');
    $description->setAttribute('about', '');
    $description->appendChild($coords);
    $node->appendChild($description);
}

$img = new Imagick('rose:');
// Write profile to image.
$img->setImageProfile('xmp', $xmp->saveXML());
$img->writeImage('output.jpg');
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$img2 = new Imagick('output.jpg');
$xmp2 = new DOMDocument();
// Read profile from image.
$xmp2->loadXML($img2->getImageProfile('xmp'));
// Grab `Coords' value
foreach($xmp2->getElementsByTagName('Coords') as $coords) {
    print $coords->textContent . PHP_EOL;
}
//=> "hello"

您可以使用identify实用程序进行验证。

identify -verbose output.jpg | grep Coords
#=> Coords: hello

当然,如果图像已包含XMP配置文件,并且您不希望覆盖现有数据,则还需要实现XML DOM“合并”方法。

答案 1 :(得分:2)

正如Ben所说,这是不可能的。相反,您可以添加&#34;评论&#34;:

function storeCommentImage($img_path, $coordinates){
    $im = new imagick($img_path);
    $im->commentImage($coordinates);
    return $im->writeImage($img_path);
}

function getCommentImage($img_path){
    $im = new imagick($img_path);
    return $im->getImageProperty("comment");
}

答案 2 :(得分:1)

好像你不能坚持jpegs的数据:https://github.com/ImageMagick/ImageMagick/issues/55#issuecomment-157114261

也许尝试用png?