【问题标题】:Generate and return an image within Silverstripe Framework在 Silverstripe 框架中生成并返回图像
【发布时间】:2013-03-14 08:46:30
【问题描述】:

我正在尝试使用 Silverstripe 3.0 框架生成图像并将其返回到模板,但遇到了一些问题。

我在一个变量中将它返回给浏览器,如下所示:

public function make_image(){

    $string = 'string';
    $im     = imagecreate(300,300);
    $orange = imagecolorallocate($im, 220, 210, 60);
    $px     = (imagesx($im) - 7.5 * strlen($string)) / 2;
    imagestring($im, 3, $px, 9, $string, $orange);
    imagepng($im);
    imagedestroy($im);

}

浏览器将其呈现为: �PNG IHDR,,C�6PLTE��<��*�"IDATh���1 �Om ?�x-��{�IEND�B`�

返回的标题是 text/html,只有一个请求让我觉得那里发生了一些奇怪的事情。谁能帮我解决这个问题。

使用 Image() 类的 Silverstripe 可能是另一种实现方式?

【问题讨论】:

  • 试试header("Content-type: image/png");
  • 我有,Silverstripe 中的标题是在模板渲染之前设置的。
  • &lt;img src="my_image.png" type="image/png" /&gt; 这方面的信息不多,但尝试强制图像在输出时显示正确不会有什么坏处。您是先将文件写入服务器还是立即将其放在页面上?如果我在终端中执行此操作; file -b my_png_file.png 它输出; PNG image data, 1920 x 1080, 8-bit/color RGB, non-interlaced。当您使用 CMS 时,可能是您的标头已发送。尝试启用error_reporting('E_ALL'); 看看是不是这样。很常见的问题。当您将 PHP 作为图像获取时,您只能使用图像标题。
  • 我的意思是标题将使整个 PHP 页面呈现为这样。因此,如果您使用header("Content-type: image/png");,您只能返回图像,而不能返回额外内容。结果将是这样的; &lt;img src="my_image.php" /&gt;.
  • @Allendar 我正在尝试将其直接输出到页面,但我不确定这是否是正确的方法。我将测试您的建议和下面的答案。

标签: php image httprequest httpresponse silverstripe


【解决方案1】:

我不太确定为什么需要使用 http 标头。我了解您正在通过中间步骤来生成图像,因此您需要看到它正在生成,但如果您的初始目标是生成图像以将其包含在模板中,这可能会有所帮助:

public function StringImage($string) {
    $filePath = ASSETS_PATH.'/'.$string.'.png';
    if (!file_exists(ASSETS_PATH.'/'.$string.'.png')){
        $stringFontSize = 11;
        $dimensions = imagettfbbox($stringFontSize, 90, 'Arial', $string);
        $gd = new GD();
        $width = $dimensions[2] - $dimensions[4];
        $height = $dimensions[7] - $dimensions[5];
        $image = imagecreatetruecolor($width, $height);
        imagefilledrectangle($image, 0, 0, $width, $height, 0xFFFFFF);
        imagettftext($image, $stringFontSize, 90, $width, $height, 0x000000, 'Arial', $string);
        $gd->setGD($image);
        $gd->writeTo($filePath);
    }
    return '<img src="'.ASSETS_DIR.'/'.$string.'.png'.'" alt="string"/>';
}

【讨论】:

  • 酷。对于想要使用上述代码的任何人来说,可能值得注意的是,在将 $string 变量用作文件名之前,应该以某种方式对其进行清理。这只是一个概念证明。
  • @DanielTate 如果答案完美,你应该接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多