2014-06-30 130 views
0

在PHP中我的imagecopymerge函數有一些非常奇怪的事情發生。我試圖將這兩個PNG文件合併到一起,並且這些文件將被合併的位置是從HTML頁面中的可拖動畫布動態獲取的。通過發佈表單,我提交'x'和'y'座標,我希望在目標圖像上進行合併(根據PHP Man提供$dst_x$dst_y參數)。PHP與imagecopymerge()合併兩個圖像()

當我嘗試在函數的實際調用中動態設置這兩個參數時,生成的圖像被正確轉儲到瀏覽器中,但是當我嘗試右鍵單擊另存爲...時,在保存的圖像上,源(合併)圖像($src_img)在(0,0)座標上開始,而不是在我指定的(或者說,用戶)上開始。如果我試圖將其保存爲整個網頁(Ctrl + S或File ... Save),則它將被正確保存(即$src_image從指定的xy座標開始)。但是,如果我硬編碼了一些x和y座標,這不會發生,我可以通過每種方法保存它(拖放到桌面,文件...保存等等)。 )在瀏覽器中,它被正確和一致地保存。

這是我的代碼:

<?php 
if(isset($_POST)){ 

    // Create image instances 
    $src = imagecreatefrompng('hello.png'); 
    $dest = imagecreatefrompng('./img/image2.png'); 
    imagealphablending($dest, true); 
    imagesavealpha($dest, true); 

    // Copy and merge 
    $posX = (int)(isset($_POST['x']) ? $_POST['x'] : null); 
    $posY = (int)(isset($_POST['y']) ? $_POST['y'] : null); 

    imagecopymerge($dest, $src, $posX, $posY, 0, 0, 200, 200, 100); //dynamic setting 

    header("Content-Disposition: inline; filename=\"rendered.png\""); 
    header('Content-Type: image/png'); 

    // Output and free from memory 

    imagepng($dest); 
    imagedestroy($src); 
    imagedestroy($dest); 
} 
?> 

我不知道爲什麼Firefox是這樣做,但我感謝所有幫助。

回答

0

如果有人遇到同樣的問題,我通過更改HTML表單上的提交方法來解決此問題。我使用get和它的工作,而不是後。不知道它爲什麼會這樣做,或爲什麼它會使實際值有所不同,但嘿,它的工作原理。

UPDATE:

提花什麼真正造成問題的原因。 From the PHP.net in the imagepng() function man

如果你動態地生成基於數據後的圖像,並且不希望將其保存到服務器,發送要顯示它可能會導致問題,當有人試圖將其保存爲,該瀏覽器會再次從服務器請求它(導致任何後期數據丟失,並可能是一個損壞的PNG)。

來解決這個問題最簡單的方法是迫使它使用內容部署頭下載,例如:

<?php 
    header('Content-Disposition: Attachment;filename=image.png'); 
    header('Content-type: image/png'); 
?>