phpImageWorkshop:保存后删除图层

时间:2014-02-18 07:16:54

标签: php

在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(),它就可以正常工作。

1 个答案:

答案 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); 

现在似乎工作正常。