【问题标题】:PHP HTML display img src using output buffer - end up with broken imagePHP HTML 使用输出缓冲区显示 img src - 以损坏的图像结束
【发布时间】:2018-12-05 22:22:58
【问题描述】:

我正在尝试编写一个包含两个 png 图像的脚本,一个是水印,另一个是源图像。代码要做的是调用一个函数,该函数执行图像复制并将两个图像混合为一个,并显示在浏览器上。但是,我总是以损坏的图像结束。

我不想保存图像,我只想让浏览器显示带有水印的源图像。 我还检查了文件权限,该功能本身在单独时可以正常工作。使用 imagepng 显示正确的图像

下面是我的测试代码:

<?php
ob_start();
showimage();
$image = ob_get_contents();
$data = base64_encode($image);
ob_clean();

echo "<h1> hello </h1>";
echo "<img src='data:image/png;base64," . $data . "'/>";

function showimage() {
    $target_dir = "./uploads/";
    $src = imagecreatefrompng($target_dir.'watermark.png');
    $dest = imagecreatefrompng($target_dir.'greenblobburnt.png');

    imagealphablending($dest, true);
    imagealphablending($src, true);
    imagesavealpha($dest, true);
    imagesavealpha($src, true);
    imagecopy ($dest,$src, 5, imagesy($dest) - (imagesy($src)+5), 0, 0,imagesx($src),imagesy($src));
    imagealphablending($dest, true);
    imagesavealpha($dest, true);
    // Output and free from memory
    header('Content-Type: image/png');
    imagepng($dest);
    imagedestroy($dest);
    imagedestroy($src);
}
?>

【问题讨论】:

  • 你误会了——不能输出带有img标签的html,也不能在src中包含图片数据。 src 需要一个 url。如果您的代码只是返回没有 html 的图像数据,那么您可以使用单独的标记将该脚本引用为 src= url。
  • 去掉header('Content-Type: image/png'); 行,否则浏览器会认为您提供的是图像而不是 HTML。它会尝试渲染它并失败。

标签: php html


【解决方案1】:

您正在尝试将 html-with-image-inlined 与原始图像二进制文件混合在一起,并且由于该 header() 调用,您告诉浏览器“这是一个 png 图像”,而实际上它是 html+原始 png 二进制连接。然后浏览器尝试渲染这个混乱,png渲染器失败,你得到“损坏的图像”错误。

尝试摆脱 html 输出和输出缓冲区,也就是

echo "<h1> hello </h1>";
echo "<img src='data:image/png;base64," . $data . "'/>";

ob_start(); $image = ob_get_contents();ob_clean();

删除它。您仍然收到损坏的图像错误吗?

【讨论】:

  • 我发布的代码是我正在尝试实现的图片库站点的测试 sn-p。我想在使用 img src 标签时显示带有水印的图像。没有解决方法吗?
  • 你熟悉data URIs吗?除了标题问题之外,他们试图做的事情没有任何问题。我怀疑删除 header('Content-Type: image/png'); 会很好地解决问题。
  • 哇,这实际上解决了我的问题,并且我的所有图像都以某种方式正确显示。为什么行标题会导致问题?我想知道您是否也更新了答案,以免人们对您的答案投反对票。我还没有足够的声誉在网站上进行投票。
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 2018-09-25
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2012-03-27
  • 2014-10-25
相关资源
最近更新 更多