在phpImageWorkshop文档(http://phpimageworkshop.com/doc/13/saving.html)中,它说:
...保存后,您将能够继续使用您的文档和 在其子图层上执行一些操作,非常方便!
然而,在致电save()
后,我无法移除水印图层。
我首先加载照片和水印并调整照片大小:
$photo = PHPImageWorkshop\ImageWorkshop::initFromPath($tmp_name);
$mark = PHPImageWorkshop\ImageWorkshop::initFromPath($watermark);
$photo->resizeInPixel(960, null, true);
然后我添加水印,保存照片,然后删除水印(这样我可以在没有水印的情况下制作其他尺寸而不创建新物体):
$photo->addLayer(1, $mark, 0, 0, 'LB');
$photo->save($path, $filename, false, null, 80); // file correctly has watermark
$photo->remove(1);
$photo->resizeInPixel(550, null, true);
$photo->save($path, $filename, false, null, 80); // file has watermark, not correct
这不会删除水印图层。但是,如果我在remove()
之前致电save()
,则会删除水印:
$photo->addLayer(1, $mark, 0, 0, 'LB');
$photo->remove(1); // calling remove() before save removes watermark
$photo->save($path, $filename, false, null, 80); // file does not have watermark
我无法理解为什么会这样,因为文档清楚地说调用save()
不会改变图层。
我已经确认水印图层已放置在第1层,如果我不调用save()
,它就可以正常工作。
答案 0 :(得分:1)
尽管文档说you'll be able to continue to use your document
,但事实是save()
函数调用getResult()
返回合并的资源图像(这在ImageWorkshopLayer.php中)
但是,如果您创建“基础图层”并在其上添加照片和水印,则save()函数似乎会合并到基础图层 - 保持照片和标记不变,因此您可以删除标记并重新保存(这会导致照片重新合并到基础层上),即
$baseimg = PHPImageWorkshop\ImageWorkshop::initVirginLayer(1024,800);
$photo = PHPImageWorkshop\ImageWorkshop::initFromPath("test.png");
$mark = PHPImageWorkshop\ImageWorkshop::initFromPath("test2.png");
$iphoto= $baseimg->addLayerOnTop($photo, 0, 0, 'LB');
$imark= $baseimg->addLayerOnTop($mark, 0, 0, 'LB');
$baseimg->resizeInPixel(960, null, true);
// file correctly has watermark
$baseimg->save(__DIR__, "test_out.png", false, null, 80);
$baseimg->remove($imark['id']);
// file correctly has no watermark
$baseimg->save(__DIR__, "test_out2.png", false, null, 80);
请注意,我使用addLayerOnTop()
的返回值来确定要移除的图层的“id”。
编辑:虽然上述方法有效,但它并不理想,因为您确实需要将生成的图像调整为重新调整大小的照片的大小。此外,我发现一旦照片成为一个图层,你必须调整该图层的大小(而不是原始照片),所以......
// load photo and mark
$photo = PHPImageWorkshop\ImageWorkshop::initFromPath("test.png");
$mark = PHPImageWorkshop\ImageWorkshop::initFromPath("test2.png");
// resize the photo 1st time
$photo->resizeInPixel(960,null, true);
$width= $photo->getWidth();
$height= $photo->getHeight();
// make empty base image same size as photo
$baseimg = PHPImageWorkshop\ImageWorkshop::initVirginLayer($width,$height);
// add photo and mark onto base image
$iphoto= $baseimg->addLayerOnTop($photo, 0, 0, 'LT');
$imark= $baseimg->addLayerOnTop($mark, 0, 0, 'LT');
$photoid= $iphoto['id']; // get layer id's
$markid= $imark['id'];
// file correctly has watermark
$baseimg->save(__DIR__, "test_out.png", false, null, 80);
// remove mark layer
$baseimg->remove($imark['id']);
// resize photo again
// - photo is now a layer in baseimg
$baseimg->layers[$photoid]->resizeInPixel(550,null, true);
$width= $baseimg->layers[$photoid]->getWidth();
$height= $baseimg->layers[$photoid]->getHeight();
// crop baseimg to match photo size
$baseimg->cropInPixel($width,$height);
// file correctly has no watermark
$baseimg->save(__DIR__, "test_out2.png", false, null, 80);
现在似乎工作正常。