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

PHP将psd转换为jpg,选择图像层,php,image,layer,imagick,psd,Php,Image,Layer,Imagick,Psd,我希望能够选择将.PSD图像中的哪些层合并到最终的.JPG输出图像中 $imagick = new \Imagick(realpath("../images/LayerTest.psd")); $output = new \Imagick(); $imagick->setIteratorIndex(1); $output->addImage($imagick->getimage()); $imagick->setIterator

我希望能够选择将.PSD图像中的哪些层合并到最终的.JPG输出图像中

    $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');
我可以将图像中的所有层合并为:

$im = new Imagick('test.psd');
$im->flattenImages();
$im->setImageFormat('jpg');
$im->writeImage('test.jpg');
但是.psd包含大约10个层,我希望能够指定哪些特定层应该合并在一起,以生成最终图像


例如,我只想合并图层编号3、5和10,或者合并名称为“红色”、“绿色”、“蓝色”的图层。

您可以使用

test.psd[3]
试一下:

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

虽然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');

然后呢?丢弃其他层?我认为JPEG中不能有多个图层。@马克:因此有了“Flattimages”这个称呼……我想我误解了他当时的要求。如果您将三个层合并在一起,然后进行展平,它会将所有层与展平调用中已合并的三个层合并,那么为什么只合并这三个层呢?顺便说一句,展平图像会返回展平图像,但不会在适当的位置执行此操作,例如“$merged=@$imagick->flattimages();”正确的语法看起来更像是
realpath(“test.psd”)。“[2]”
将正确的路径传递给Imagick。但是,我似乎根本无法让图像展平工作。嗯,如果你按正确的顺序获得图层,展平工作就会起作用:-p这就是为什么我感到困惑,我无法理解这里的上下文,因为问题不清楚。你如何访问图层名称?@hsz你如何访问layer name?@santyas仅供参考,在回答五年后的评论中提出不同的问题通常不会得到回应。i)我不知道ii)你应该作为单独的问题提问。