PHP使用imagecopymerge()合并两个图像

PHP使用imagecopymerge()合并两个图像,php,html,firefox,image-processing,gd,Php,Html,Firefox,Image Processing,Gd,在PHP中,我的imagecopymerge函数发生了一些非常奇怪的事情。我正在尝试将这两个png文件一个接一个地合并,合并位置是从html页面中的可拖动画布动态获取的。通过一个post表单,我将要在目标图像上进行合并的“x”和“y”坐标($dst_x和$dst_y参数根据PHP Man)提交到我的PHP文件中 当我尝试在实际调用函数时动态设置这两个参数时,生成的图像将正确转储到浏览器中,但当我尝试右键单击“另存为…”时,在保存的映像上,源(合并)映像($src_img)从(0,0)坐标开始,而

在PHP中,我的imagecopymerge函数发生了一些非常奇怪的事情。我正在尝试将这两个png文件一个接一个地合并,合并位置是从html页面中的可拖动画布动态获取的。通过一个post表单,我将要在目标图像上进行合并的“x”和“y”坐标(
$dst_x
$dst_y
参数根据PHP Man)提交到我的PHP文件中

当我尝试在实际调用函数时动态设置这两个参数时,生成的图像将正确转储到浏览器中,但当我尝试右键单击“另存为…”时,在保存的映像上,源(合并)映像(
$src_img
)从(0,0)坐标开始,而不是从我指定的坐标(或者更确切地说,用户)开始。如果我尝试将其保存为整个网页(Ctrl+S或File…save),则会正确保存(即,
$src_图像
从指定的
x
y
坐标开始)

但是,如果我硬编码一些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为什么要这样做,但我非常感谢您的帮助。

如果有人遇到同样的问题,我通过更改HTML表单上的提交方法解决了这个问题。我用get代替post,它起作用了。不知道为什么会这样,或者为什么它会对实际值产生任何影响,但是,嘿,它起作用了

更新:

找出了问题的真正原因:

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

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


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