4

次の基本イメージ (PNG-24) を使用します。

ここに画像の説明を入力

次のように、画像にテキストを書き込もうとしています。

<?
ini_set('display_errors', 1); 
error_reporting(E_ALL);

//#### Load the base image
$im = imagecreatefrompng("images/SpecialClearanceBlank.png");
imagealphablending($im, false);
imagesavealpha($im, true);

//#### Create the badge
if($im) {
    //#### define some colours to use with the image
    $white = imagecolorallocate($im, 255, 255, 255);

    //#### get the width and the height of the base image
    $width = imagesx($im);
    $height = imagesy($im);

    //#### Define font and text
    $font = "/var/www/arial.ttf";
    $fontSize = 13;
    $angle = 0;
    $text = "15%";

    //#### calculate the left position of the text:
    $dimensions = imagettfbbox($fontSize, $angle, $font, $text);
    $textWidth = abs($dimensions[4] - $dimensions[0]);
    $leftTextPos = ( $width - $textWidth ) / 2;

    //#### finally, write the string:
    //imagestring($im, 5, $leftTextPos, $topTextPos, $text, $white);
    imagettftext($im, $fontSize, $angle, $leftTextPos + 1, 29, $white, $font, $text);

    // output the image
    // tell the browser what we're sending it
    Header('Content-type: image/png');
    // output the image as a png
    imagepng($im);

    // tidy up
    imagedestroy($im);
}

?>

これは低品質のテキストを生成しています (非常にむらがあります) - テキストをアンチエイリアスして滑らかに見せるにはどうすればよいでしょうか?

これはブロック状のバージョンです:

ここに画像の説明を入力

レンダリングされた png (フォトショップで拡大) を詳しく分析すると、書いているテキストにアンチエイリアシングがなく、書かれているピクセルがほとんど透明であることがわかりますか?

何が原因ですか - スムーズなテキストを取得するにはどうすればよいですか?

ここに画像の説明を入力

4

2 に答える 2

9

説明:

imagealphablendingトゥルーカラー画像で使用する場合はオンにする必要があります。オンにしないとimagettftext、各宛先ピクセルの色ではなく、画像の黒地の色に対してエイリアシングが計算されます。

正しい (明示的な) 設定は次のようになります。

//#### Load the base image
$im = imagecreatefrompng("images/SpecialClearanceBlank.png");
imagealphablending($im, true);
                        ^^^^

あなたの写真はデフォルトで有効になっています。そのため、false以前に作成した非エイリアス効果に設定しています。

于 2012-11-09T17:16:08.893 に答える
2

理解した:

とへの私の呼び出しはそれを引き起こしimagealphablending()imagesavealpha()いるものです!テキストを書いた後でこれらを呼べば大丈夫です!

(理由はわかりませんが、説明に興味があるでしょう)

以下は、これを生成するための作業コードです。

以下のコードからのPNGの例

<?
Header('Content-type: image/png');

$Percentage = round(@$_GET["value"]);
$root = dirname(__FILE__) . "\\";

//#### Check the Cache
if (file_exists("images/Badges_Discounts/" . $Percentage . ".png") === true) {
    //#### Serve image from cache
    $im = imagecreatefrompng("images/Badges_Discounts/" . $Percentage . ".png");

    //#### Fix transparency
    imagealphablending($im, false);
    imagesavealpha($im, true);

    //#### Output from cache
    imagepng($im);

    //#### tidy up
    imagedestroy($im);

} else {
    //#### Load the base image
    $im = imagecreatefrompng("images/SpecialClearanceBlank.png");

    //#### Create the badge
    if($im) {
        //#### define some colours to use with the image
        $white = imagecolorallocate($im, 255, 255, 255);

        //#### get the width and the height of the base image
        $width = imagesx($im);
        $height = imagesy($im);

        //#### Define font and text
        $font = $root . "arial.ttf";
        $fontSize = 15;
        $angle = 0;
        $text = $Percentage . "%";

        //#### calculate the left position of the text:
        $dimensions = imagettfbbox($fontSize, $angle, $font, $text);
        $textWidth = abs($dimensions[4] - $dimensions[0]);
        $leftTextPos = ( $width - $textWidth ) / 2;

        //#### write the XX%
        imagettftext($im, $fontSize, $angle, $leftTextPos + 1, 26, $white, $font, $text);

        //#### write the word "off"
        $dimensions = imagettfbbox($fontSize, $angle, $font, "off!");
        $textWidth = abs($dimensions[4] - $dimensions[0]);
        $leftTextPos = ( $width - $textWidth ) / 2;
        imagettftext($im, 13, $angle, $leftTextPos + 4, 41, $white, $font, "off");

        //#### Fix transparency
        imagealphablending($im, false);
        imagesavealpha($im, true);

        //#### Save to cache
        imagepng($im, $root . "images\\Badges_Discounts\\" . str_replace("%","",$text) . ".png");

        //#### Output to browser
        imagepng($im);

        //#### tidy up
        imagedestroy($im);
    }
}

?>
于 2012-11-09T17:00:57.517 に答える