猿问

生成具有不同文本的图像的问题

我正在创建一个学生证系统,每个学生都有自己的。

为此,我使用干预图像来获取学生数据并放入标准 ID 卡模板。

我所做的基本代码是:

<?php


[...]


$card = Image::make('card_id-model.png');


$card->text('CARD ID', 20, 40, function($font) {

    $font->file('arial.ttf');

    $font->size(24);

    $font->color('#fdf6e3');

    $font->align('center');

    $font->valign('top');

    $font->angle(45);

});


$card->text('NAME: STUDENT\'S NAME', 20, 60, function($font) {

    $font->file('arial.ttf');

    $font->size(24);

    $font->color('#fdf6e3');

    $font->align('center');

    $font->valign('top');

    $font->angle(45);

});


$card->text('CODE: STUDENT\'S CODE', 20, 80, function($font) {

    $font->file('arial.ttf');

    $font->size(24);

    $font->color('#fdf6e3');

    $font->align('center');

    $font->valign('top');

    $font->angle(45);

});


$card->save('card_id - student\'s code.png');

这种方式比较慢,考虑到我每次创建图像时都会调用该函数。所以我决定首先实例化图像,因为它将用于所有卡片 id。好吧,但是我在循环应用它以同时生成几个时遇到了问题,因为文本被覆盖了。

<?php


[...]


$card = Image::make('card_id-model.png');


$card->text('CARD ID', 20, 40, function($font) {

    $font->file('arial.ttf');

    $font->size(24);

    $font->color('#fdf6e3');

    $font->align('center');

    $font->valign('top');

    $font->angle(45);

});


for ($students as $student) {

    $card->text('NAME: ' . $student->name, 20, 60, function($font) {

        $font->file('arial.ttf');

        $font->size(24);

        $font->color('#fdf6e3');

        $font->align('center');

        $font->valign('top');

        $font->angle(45);

    });


    $card->text('CODE: ' . $student->code, 20, 80, function($font) {

        $font->file('arial.ttf');

        $font->size(24);

        $font->color('#fdf6e3');

        $font->align('center');

        $font->valign('top');

        $font->angle(45);

    });


    $card->save('card_id - ' . $student->code . '.png');

}

这是我发现的最好和最快的大规模生产方式。有人有任何提示吗?


慕盖茨4494581
浏览 150回答 2
2回答

慕侠2389804

我通常先在 AI 中进行设计,然后从中取出 SVG,然后用 CSS+HTML 填充。由于 PHP 可以帮助填写它,因此我仅使用它来生成 HTML。然后 HTML 将转换为 PDF,然后我就从那里打印出来。在任何情况下,PHP 都不是生成图像的理想选择,尽管有一种方法可以做到。使用浏览器的力量来做到这一点。谷歌浏览器很强大,但如果你需要它在服务器上运行,你可以使用 wkhtmltopdf。

SMILET

您遇到了文本覆盖问题,因为您正在对原始对象调用文本函数。相反,您需要对元素的副本进行修改,然后将其保存在数组中。参见示例。$generatedCards = [];foreach ($students as $student) {&nbsp; &nbsp; $generatedCard = clone $card;&nbsp; &nbsp; $generatedCard->text('...');&nbsp; &nbsp; $generatedCards[] = $generatedCard;}
随时随地看视频慕课网APP
我要回答