2014-05-13 57 views
0

我想從兩幅圖像中製作具有淡入淡出效果的混合圖像。COMPOSITE_DISSOLVE無法在PHP中工作

這是我的PHP代碼。

$img1 = new Imagick(); 
$img1->readImage("images/1.jpg"); 

$img2 = new Imagick(); 
$img2->setOption('compose:args', '50'); 
$img2->readImage("images/2.jpg"); 

$img1->compositeImage($img2, imagick::COMPOSITE_DISSOLVE, 0, 0); 
$img1->writeImage("images/3.jpg"); 

此代碼在我的Mac OS上正常工作。

但它不能在遠程服務器上運行(Cent OS 6.5),結果圖像與2.jpg相同。

我試着用COMPOSITE_BLEND常量,它工作得很好。

我試着在終端命令。

# composite -dissolve 50 2.jpg 1.jpg 3.jpg 

它也很好。

爲什麼COMPOSITE_DISSOLVE不能在PHP中持續工作?

請幫幫我。

+0

在使用不同版本的ImageMagick編譯的兩臺服務器上使用PHP嗎?對於許多常量,它在http://www.php.net/manual/en/imagick.constants.php#imagick.constants.compositeop中提到了這一點,雖然不是這一個,仍然可能是這樣。 – developerwjk

+0

你能說出你在服務器上使用的Imagick = ImageMagick的確切版本嗎? – Danack

+0

Imagick模塊版本是3.1.2,ImageMagick版本是6.5.4-7。兩個版本可能永遠不會相同。 – jeilsoft

回答

1

你真的應該弄清楚你的開發環境和你的服務器有什麼不同。這很可能是因爲開發服務器上的ImageMagick版本已經過時,除非您自己編譯它,因爲Centos軟件包管理系統似乎需要很長時間才能獲得新版本。

但是....你混合圖像的方式並不是太棒了。雖然它可能適用於您,但它需要定義稍差的$img2->setOption('compose:args', '50');行。

一個更強大的技術是通過COMPOSITE_COPYOPACITY自己控制alpha通道。這使您可以完全控制圖像的混合方式。例如

$img1 = new \Imagick(); 
$img1->readImage(realpath("../images/Biter_500.jpg")); 

$img2 = new \Imagick(); 
$img2->readImage(realpath("../images/Skyline_400.jpg")); 

//Resize images to the same size, to look pretty. 
$img1->resizeimage(
$img2->getImageWidth(), 
$img2->getImageHeight(), 
\Imagick::FILTER_LANCZOS, 
1 
); 

//Create an image that the alpha will be created in. 
$opacity = new \Imagick(); 

if (true) { 
    //Create a 50% grey image 
    $opacity->newPseudoImage($img1->getImageWidth(), $img1->getImageHeight(), "CANVAS:gray(50%)"); 
} 
else { 
    //Create a far more interesting blend. 
    //Gradients are created top to bottom, so we need to rotate the image 
    $opacity->newPseudoImage($img1->getImageHeight(), $img1->getImageWidth(), "gradient:gray(10%)-gray(90%)"); 
    $opacity->rotateimage('black', 90); 
} 

$img2->compositeImage($opacity, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); 
$img1->compositeImage($img2, \Imagick::COMPOSITE_ATOP, 0, 0); 

header("Content-Type: image/jpg"); 
echo $img1->getImageBlob(); 

"CANVAS:gray(50%)"創建不透明圖像的第一種方式做你的現有圖像的代碼做什麼。混合的第二種方式是在圖像寬度範圍內創建一個從10%到90%混合的圖像。

+0

感謝您的幫助。你救了我! – jeilsoft

+0

不知道如何行: '$ opacity-> newPseudoImage($ img1-> getImageHeight(),$ img1-> getImageWidth(),「gradient:grey(10%) - grey(90%)」); $ opacity-> rotateimage('black',90);'將永遠運行,因爲你有'如果(真)'高於那幾行。 – Andri

+0

@Andri這是用於混合圖像的替代方式的示例代碼,其中混合強度在圖像中變化,而不僅僅是恆定的50%。 – Danack