【问题标题】:PHP merge two images with imagecopymerge()PHP 用 imagecopymerge() 合并两张图片
【发布时间】:2014-08-21 07:54:36
【问题描述】:

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

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

【问题讨论】:

    标签: php html firefox image-processing gd


    【解决方案1】:

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

    更新:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 2022-01-19
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多