4

私には奇妙な状況があります。

背景が常に透明であるとは限らないように見えますが、ある程度壊れています...

良いもの 30度

良くない

コードは次のとおりです。

$angle = !empty($_GET['a']) ? (int)$_GET['a'] : 0;

$im = imagecreatefromgif(__DIR__ . '/track/direction1.gif');
imagealphablending($im, false);
imagesavealpha($im, true);

$transparency = imagecolorallocatealpha($im, 0, 0, 0, 127);
$rotated = imagerotate($im, $angle, $transparency);

imagealphablending($rotated, false);
imagesavealpha($rotated, true);

imagepng($rotated);
imagedestroy($rotated);

imagedestroy($im);
header('Content-Type: image/png');

何が起こっているのか理解できません...私は見逃していますか?

編集1

その機能を追加しました:

if(!function_exists('imagepalettetotruecolor'))
{
    function imagepalettetotruecolor(&$src)
    {
        if(imageistruecolor($src))
        {
            return true;
        }

        $dst = imagecreatetruecolor(imagesx($src), imagesy($src));
        $black = imagecolorallocate($dst, 0, 0, 0);
        imagecolortransparent($dst, $black);

        $black = imagecolorallocate($src, 0, 0, 0);
        imagecolortransparent($src, $black);

        imagecopy($dst, $src, 0, 0, 0, 0, imagesx($src), imagesy($src));
        imagedestroy($src);

        $src = $dst;

        return true;
    }
}

しかし、今はその四角が透明になりたくないことにこだわっています....

ほとんど

4

2 に答える 2

1

imagecreatefromgif()トゥルーカラー画像ではなく、パレット画像を作成します (これは、GIF 形式が画像をエンコードする方法であるためです)。パレット付きの画像では、透明度はトゥルーカラー画像とは異なり、計算した値$transparencyは役に立ちません。

$im解決策は、回転する前にトゥルー カラーに変換することです。関数imagepalettetotruecolor()はこれを行います。PHP 5.5 以降で使用できます。古いバージョンに固執している場合は、自分で実装する必要があります。ドキュメントページの最後の例を確認してください。既に実装されており、透過性も考慮されています (実行時に発生する小さなバグがいくつかあります)。

于 2014-12-10T17:57:32.867 に答える