【问题标题】:Using imagick with php in files PSD在文件 PSD 中使用 imagick 和 php
【发布时间】: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');
}

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

【问题讨论】:

    标签: php gd imagick psd


    【解决方案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
    • 再次感谢。我明白,但我需要图层的名称,而且我没有权限在服务器上执行“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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-13
      • 2017-11-14
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2018-04-07
      相关资源
      最近更新 更多