PHP GD Создание 3D-вид вкладок меню - PullRequest
0 голосов
/ 26 января 2020

Две функции ниже работают вместе, чтобы создать красивые динамические c метки прозрачного фона для одного из моих сайтов, но теперь я хотел бы использовать то, что он уже делает, чтобы он мог создавать вкладки меню сайта, которые в настоящее время физические картинки. Я немного изменил функцию textimage (), добавив логическое значение $ AsTab, чтобы оно также могло создавать вкладки, не удаляя его текущее назначение, и оно действительно делает одно, но, конечно, на прозрачном фоне.

Что я ищу, так это темно-красный язычок с квадратными верхними углами и закругленными нижними углами с точеным взглядом по краям. Внизу два примера изображения, одно из которых показывает, что я пытаюсь создать, а другое показывает, что этот код создает сейчас. Как мне достичь желаемого эффекта или чего-то похожего на него?

function textimage() {
    global $FontPath;
    global $Height;
    global $String;
    global $FontName;
    global $FontSize;
    global $Angle;
    global $EnableShadow;
    global $CenterAlign;
    global $AsTab;

    // Create additional values and calculations
    $FontPath = $_SERVER['DOCUMENT_ROOT'] . "$FontPath";
    $Font = $FontPath . $FontName;
    $String = html_entity_decode($String);
    $TextDimensions = imagettfbbox($FontSize,$Angle,$Font,$String);
    $Width = ($AsTab !== TRUE) ? (abs($TextDimensions[4] - $TextDimensions[0]) + 5) : (abs($TextDimensions[4] - $TextDimensions[0]) + 20);
    $Height = ($AsTab !== TRUE) ? (abs($TextDimensions[5] - $TextDimensions[1])) : $Height;
    $y_offset = abs($TextDimensions[5]);
    $Image = imagecreatetruecolor($Width,$Height);
    imagesavealpha($Image, TRUE);
    $TransColor = imagecolorallocatealpha($Image, 0, 0, 0, 127);
    imagefill($Image, 0, 0, $TransColor);
    $TextColor = imagecolorallocate($Image,0x00,0x00,0x55);
    $ShadowColor = imagecolorallocate($Image,0x77,0x77,0x77);
    $Lines = explode("\n",$String);

    foreach ($Lines as $Line):
        if ($EnableShadow === TRUE):
            if ($CenterAlign === TRUE):
                $x_offset = CenterText($FontSize,$Font,$Line,$Width);
            else:
                $x_offset = ($Width / 2) - ((min($TextDimensions[2],$TextDimensions[4]) - max($TextDimensions[0],$TextDimensions[6])) / 2);
            endif;
            imagettftextblur($Image,$FontSize,$Angle,$x_offset+5,$y_offset+5,$ShadowColor,$Font,$Line,10);
            imagettftextblur($Image,$FontSize,$Angle,$x_offset,$y_offset,$TextColor,$Font,$Line);
        else:
            if ($CenterAlign === TRUE):
                $x_offset = CenterText($FontSize,$Font,$Line,$Width);
            else:
                $x_offset = ($Width / 2) - ((min($TextDimensions[2],$TextDimensions[4]) - max($TextDimensions[0],$TextDimensions[6])) / 2);
            endif;
            imagettftext($Image,$FontSize,$Angle,$x_offset,$y_offset,$TextColor,$Font,$Line);
        endif;
        $y_offset += $FontSize * 1.5;
    endforeach;

    return imagepng($Image);
    imagedestroy($Image);
}

function CenterText($FontSize,$Font,$String,$BoxWidth) {
    $TextDimensions = imagettfbbox($FontSize,0,$Font,$String);
    $xi = abs($TextDimensions[4]);
    $x = intval(($BoxWidth - $xi) / 2);
    return $x;
}

Он вызывается так, что для проверки целей в нем жестко закодирована текстовая строка:

<?php

// Specify path and font
$FontPath = "/internals/truetype/";
$FontName = "vineritc.ttf";

// Text font size, angle and style
$FontSize = 12;
$Angle = 0;
$Height = 32;
$EnableShadow = FALSE;
$CenterAlign = TRUE;
$AsTab = TRUE;

$String = "Search";

//$TextImage = textimage();

header("Pragma: no-cache");
header('Content-Type: image/png');

$TextImage = textimage();

echo $TextImage;
?>

Sample of existing menu tab image

Image as currently being created but this code

...