PHP与imagecopymerge()合并两个图像

时间:2014-06-30 20:47:50

标签: php html firefox image-processing gd

我的imagecopymerge函数在PHP中发生了一些非常奇怪的事情。我试图将这两个png文件合并在另一个上面,并且这些合并的位置是从html页面中的可拖动画布动态获取的。通过邮寄表格,我提交了' x'并且' y'坐标我希望目标图像上的合并发生(根据PHP Man。$dst_x$dst_y参数)到我的php文件。

当我尝试在实际调用函数时动态设置这两个参数时,生成的图像会正确地转储到浏览器中但是当我尝试右键单击另存为...时,在保存的图像上,源代码(合并)图像($src_img)从(0,0)坐标开始,而不是我指定的(或者更确切地说,用户)。如果我尝试将其保存为整个网页(Ctrl + S或文件...保存),则会正确保存(即$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会这样做,但我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果有人遇到同样的问题,我通过更改HTML表单上的提交方法解决了这个问题。而不是发布,我使用了get,它起作用了。不确定它为什么会这样做,或者为什么它会使实际值产生任何差异,但是嘿,它有效。

更新:

想出真正导致问题的原因。 From the PHP.net in the imagepng() function man

  

如果您根据发布数据动态生成图像并且不想将其保存到服务器,则发送它以显示可能会导致问题,因为当用户尝试保存它时,浏览器会再次请求它从服务器(导致任何帖子数据丢失,可能是一个损坏的png)。

     

解决此问题的最简单方法是使用内容处置标头强制下载,例如:

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