1

簡単な質問です。あちらこちらで検索しましたが、これを作成する方法が見つかりませんでした。

次のような文字列(変数)があります。

#FF9900Hel#FFFFFFlo

imagettftext 関数にこれらの色を認識させ、それらの色を使用してテキストを描画させる方法が必要です。たとえば、前述の例では、テキストは次のようにする必要があります。赤: Hel、白:lo. 私が言いたいことをうまく説明できれば幸いです。

前もって感謝します

4

2 に答える 2

3

色を認識するだけでなく、文字列を揃える必要があります。これは HTML のように自動ではありません。

これを行うには、最初に文字列を構成要素に分割します。

// Split the text using hex colors as strings:
$hex     = '[0-9a-fA-F]'; // Capital hex should be supported

$colorex = "(#{$hex}{$hex}{$hex}{$hex}{$hex}{$hex})";
// or also $colorex = "(#{$hex}{6})";

$parts = preg_split ("/{$colorex}/", $text, -1, PREG_SPLIT_DELIM_CAPTURE);

// Then you would iterate through the parts:

$color = imageColorAllocate($gd, 0, 0, 0); // Default is black
foreach($parts as $part)
{
    // Scan the hex value
    if (preg_match("/^{$colorex}\$/", $part, $gregs))
    {
        sscanf($gregs[1], "#%02x%02x%02x", &$r, &$g, &$b);
        $color = imageColorAllocate($gd, $r, $g, $b);
        continue;
    }
    // IMPROVEMENT: if count(explode("\n", $part)) > 1, $y += $height, $x = 0
    // to indicate "go to next line". So this would appear on two lines:
    //     #012345Hel#ff7700lo,
    //     #443212World 
    // Next section will be repeated for each item
    // in the exploded string.
    //! $subparts = explode("\n", $part);
    //! foreach($subparts as $part)
    //! { // We have overwritten $part

    // Here $part is printed as string at position $x, $y
    // Ask GD to calculate string width
    // with http://php.net/manual/en/function.imagettfbbox.php
    // Calculations with $angle != 0 is a bit more difficult, entails trigonometric
    // evaluation of $w and $h.
    $bbox = imagettfbbox ($size, $angle, $fontfile, $part);
    $w    = $bbox[4] - $bbox[0];  // 0,1 is lower left corner
    $h    = $bbox[5] - $bbox[1];  // 4,5 is upper right
    imagettftext ($gd, $size, $angle, $x, $y, $color, $fontfile, $part);
    // Increment $x position by $w
    $x += $w;

    //!     if (count($subparts) > 1)
    //!     {
    //!         $x = 0; $y += $h;
    //!     }
    //! }
}
于 2012-07-10T19:04:37.787 に答える
3

色と対応する文字列を解析し、一意の色ごとに GD カラー リソースを割り当て、必要に応じてと座標をimagettftext調整するために個別の呼び出しを行う必要があります。xy

関数はこれimagettxtextを行うことはできませんし、行いません。

別の色のテキストの次のチャンクを適切に配置するために必要なテキストの各スライスの境界ボックスを計算するためにこの関数が必要になるため、imageftbboxを調べます。

これは、HTML の色をimagecolorallocateに渡すことができる 16 進数トリプレットに変換する関数です。

function htmlColorToHex($color) {
    if (substr($color, 0, 1) == '#') {
        $color = substr($color, 1);
    }

    if (strlen($color) == 3) {
        $red   = str_repeat(substr($color, 0, 1), 2);
        $green = str_repeat(substr($color, 1, 1), 2);
        $blue  = str_repeat(substr($color, 2, 1), 2);
    } else {
        $red   = substr($color, 0, 2);
        $green = substr($color, 2, 2);
        $blue  = substr($color, 4, 2);
    }

    $hex = array('r' => hexdec($red),
                 'g' => hexdec($green),
                 'b' => hexdec($blue));

    return $hex;
}

やりたいことの中で最も複雑な部分は、テキストの各部分の座標を正しく計算することです。

于 2012-07-10T18:58:37.907 に答える