PHP将psd转换为jpg,选择图像层

3
我想能够选择哪些图层从.PSD图像合并到最终的.JPG输出图像中。
我可以使用以下方法合并图像中的所有图层:
$im = new Imagick('test.psd');
$im->flattenImages();
$im->setImageFormat('jpg');
$im->writeImage('test.jpg');

然而,该.psd文件包含大约10个图层,我想能够指定哪些特定图层应合并在一起,以生成最终图像。
例如,我想要仅合并第3、5和10个图层或具有名称“RED”、“GREEN”、“BLUE”的图层。

1
然后呢?丢弃其他层吗?我认为JPEG中不能有多个层。 - Mark
@mark:因此,“flattenImages”调用... - Marc B
我想我可能误解了他的问题。如果您要合并三个图层,然后再将它们压平,那么在压平调用中,它将合并所有已经合并的三个图层,那么为什么不只合并这三个呢? - Mark
顺便提一下,flattenImages 方法会返回扁平化后的图像,不会直接在原图上进行修改,例如:“$merged = @$imagick->flattenimages();”。 - Danack
2个回答

5
虽然hsz的答案是正确的,而且在图像非常大的情况下是最好的方法,但它确实需要您事先知道要合并哪些图层。
您可以通过使用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');

你如何访问图层名称? - santyas
@santyas 提醒您,通常在答案发布五年后的评论中提出不同的问题不会得到回复。i)我不知道 ii)您应该将其作为一个单独的问题提出。 - Danack

3

您可以使用以下方法访问第三层:

test.psd[3]

尝试以下操作:

$im = new Imagick(array('test.psd[3]', 'test.psd[5]', 'test.psd[10]'));

正确的语法似乎更像是 realpath("test.psd")."[2]",以便将正确的路径传递给Imagick。然而,我似乎无法使图像平坦化工作。 - Danack
嗯,如果你按正确的顺序获取层,压平就能正常工作 :-P - Danack
这就是我感到困惑的原因,因为问题缺乏明确性,所以我无法理解这里的上下文。 - Mark
你如何访问图层名称?@hsz - santyas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接