在文件 PSD 中使用 imagick 和 php

Posted

技术标签:

【中文标题】在文件 PSD 中使用 imagick 和 php【英文标题】:Using imagick with php in files PSD 【发布时间】:2021-08-10 08:56:48 【问题描述】:

我想知道是否可以使用 Imagick 和 php 来获取 PSD 具有的图层的名称。

在这个开始我已经可以得到一个层的基本数据,例如高度、大小、位置x和位置y(下面的代码是一个例子)。

for ($i = 0, $num_layers = $im->getNumberImages(); $i < $num_layers; ++$i) 
    $im->setImageIndex($i);         //this
    $im->setIteratorIndex($i);      //or this is kinda redundant
    $pagedata=$im->getImagePage();

    print("x,y: " . $pagedata["x"].", ".$pagedata["y"]."<br />\n");
    print("w,h: " . $pagedata["width"].", ".$pagedata["height"]."<br />\n");

    //export layer
    //$im->writeImage('layer_' . $i . '.png');

不过我也需要获取图层的名称,附件是我需要获取的名称的打印件:

【问题讨论】:

【参考方案1】:

您可以通过使用更以编程方式执行相同的操作 setIteratorIndex 访问各个层并将它们添加到输出图像中。

$imagick = new \Imagick(realpath("../images/LayerTest.psd"));

$output = new \Imagick();
$imagick->setIteratorIndex(1);
$output->addImage($imagick->getimage());

$imagick->setIteratorIndex(2);
$output->addImage($imagick->getimage());

$merged = @$output->flattenimages();
$merged->setImageFormat('jpg');
$merged->writeImage('test.jpg');

编辑:固定格式

【讨论】:

感谢您的回答,但是我想知道是否可以在我正在获取尺寸和位置的循环期间获取图层的名称,在我的情况下,我需要有名称层的。 将来自其他链接的命令放入 PHP exec() 命令中并从 exec() 中提取数组并选择包含名称的数组元素。见us2.php.net/manual/en/function.exec.php。 legacy.imagemagick.org/discourse-server/viewtopic.php?t=23515 再次感谢。我明白,但我需要图层的名称,而且我没有权限在服务器上执行“exec”函数,我看到的 Imagick api 返回文件属性,但在我的情况下,我只需要元素构成图层的属性。我在您发送的链接中看到用户与我的情况相同,Imagick“getProperty”的功能仅从文件中返回数据,而不是从图层/框架返回。【参考方案2】:

是的,这是可能的。

// Load the PSD file
$psd = new Imagick($src);

// Export layers
foreach ($psd as $no => $layer) 

    // Skip the first layer 
    if (!$no) 
        continue;
    

    // Get the layers positions and dimensions
    $imagePage = $layer->getImagePage();

    // Extract the next values ['x', y', 'width', 'height']
    extract($imagePage); 

    // Debug
    print '<pre>';
    print_r($imagePage);
    print '</pre>';

    // Get the name of this layer
    $imageProperties = $layer->getimageproperties();
    $label = $imageProperties['label'];

    // Do action by the name of the layer
    switch (strtolower($label)) 
        case 'layer-name':
            // Code...
            break;
        
        default:
            // Code...
            break;
    

【讨论】:

以上是关于在文件 PSD 中使用 imagick 和 php的主要内容,如果未能解决你的问题,请参考以下文章

GD中支持的格式使用php保存图像

有没有办法用 PHP 和 Imagick 找到被黑色边框包围的特定像素区域?

PHP使用JPG生成GIF动画图片,基于php_imagick_st-Q8.dll

phpstudy安装imagick扩展库怎么装

在 Azure php 服务器上使用 Imagick 安装 Ghostscript

使用 Imagick 转换透明 PDF 文件