如何在没有任何外部库的情况下从Laravel PHP中的文本创建图像

时间:2018-04-07 05:32:21

标签: php laravel

我正在使用此代码

从文本中创建Core PHP中的图像
header ("Content-type: image/png");
$text='test@example.com';
$string = $text;                                            
$font   = 3;
$width  = ImageFontWidth($font) * strlen($string);
$height = ImageFontHeight($font);

$im = @imagecreate ($width,$height);
$background_color = imagecolorallocate ($im, 255, 255, 255); //white background
$text_color = imagecolorallocate ($im, 0, 0,0);//black text
imagestring ($im, $font, 0, 0,  $string, $text_color);
echo imagepng ($im);

上面的代码工作正常在核心PHP文件中,但现在我正在研究laravel框架中的项目。我对laravel来说是全新的。当我在laravel中尝试相同的代码时,它不起作用。我尝试更改响应方法但仍然失败 这是我尝试过的。

public function imgCreate(){
    header ("Content-type: image/png");
    $text='test@example.com';
    $string = $text;                                            
    $font   = 3;
    $width  = ImageFontWidth($font) * strlen($string);
    $height = ImageFontHeight($font);
    $im = @imagecreate ($width,$height);
    $background_color = imagecolorallocate ($im, 255, 255, 255); //white background
    $text_color = imagecolorallocate ($im, 0, 0,0);//black text
    imagestring ($im, $font, 0, 0,  $string, $text_color);

    echo imagepng($im);
    //return response($im)->withHeaders(['Content-type'=>'image/png']); 
}

所以基本上,我在控制器函数(imgCreate)中粘贴了相同的代码。我尝试了不同的响应方法似乎都有错误  当我像这样回来时

 //echo imagepng($im);
return response($im)->withHeaders(['Content-type'=>'image/png']);

它会抛出错误 “Response内容必须是实现__toString()的字符串或对象,”resource“。”

当我尝试通过

的简单方法时
echo imagepng($im);
//return response($im)->withHeaders(['Content-type'=>'image/png']);  

我得到一个不可读的字符串: -

“ PNGIHDRpK xPLTE U ~ IDAT c0S �� ��q��������67?>�/�Ð8ۘ��f��3�%Hn�cH���}����H� �riggc�0Ncȝm�qss��ǒ%7�1X||x����l����ripW400#; �^10�� IEND B` 1”

是否可以在laravel中创建图像?或者我做错了什么? 据我说,问题似乎是标题“内容类型”,它负责以图像的形式返回结果。

先谢谢!!!!!

2 个答案:

答案 0 :(得分:2)

您可以通过将图片编码为base_64

来实现此目的
    $text='test@example.com';
    $string = $text;                                            
    $font   = 3;
    $width  = ImageFontWidth($font) * strlen($string);
    $height = ImageFontHeight($font);
    $im = @imagecreate ($width,$height);
    $background_color = imagecolorallocate ($im, 255, 255, 255); //white background
    $text_color = imagecolorallocate ($im, 0, 0,0);//black text
    imagestring ($im, $font, 0, 0, $string, $text_color);
    ob_start();
    imagepng($im);
    $imstr = base64_encode(ob_get_clean());
    imagedestroy($im);
    return view('index',array('data'=>$imstr));

并在视图中查看图片

    <img src="data:image/png;base64,{{ $data }}"/>

https://stackoverflow.com/a/3386050/8317643启发

答案 1 :(得分:0)

运行隔离时,您的代码似乎有效。我假设laravel在输出之前发送自定义标头或向输出添加内容。两者都可能使你的形象失败。

解决您的问题:找出浏览器端的内容类型和/或找出laravel是否输出其他内容。例如html代码。