1

よし、私は GD Image を 2 か月間ハックしてきました。これを使って達成したいタスクは、既存の画像を取得し、その下でフェードアウトして半透明になる反射を作成するスクリプトを作成することでした。 .
次のガイドは、不透明な色でそれを行う方法を示しています: TalkPHP Forums Link

そのフォーラムで、Rendair は、色を使用して動的に描画されたグラデーションを次の PHP コードでオーバーレイする方法について説明しています。

    // Next we draw a GD line into our gradient_line
imageline ($gradient_line, 0, 0, $imgName_w, 0, $gdGradientColor);


$i = 0;
$transparency = 30; //from 0 - 100

    while ($i < $gradientHeight) //create line by line changing as we go
    {
        imagecopymerge ($background, $gradient_line, 0,$gradient_y_startpoint, 0, 0, $imgName_w, 1, $transparency);

        ++$i;
        ++$gradient_y_startpoint;

                if ($transparency == 100) {

                    $transparency = 100;

                }
                else 
                {
         // this will determing the height of the
         //reflection. The higher the number, the smaller the reflection. 
         //1 being the lowest(highest reflection)
                    $transparency = $transparency + 1; 

                }

    }  

私が達成しようとしているのは、アルファ機能を使用して各線を同様に半透明にフェードさせる効果ですが、一度に1行ずつ適用するのは難しいようです. これまでのところ、画像の小さなスライス (1 ラインの大きさ) を作成して半透明でオーバーレイすることしかできません。各ラインをもう少しフェードさせることはできません。したがって、私の意図した結果は最初の画像であり、次に反射されたコピーが 100% アルファ透明にフェードするはずですが、これを達成できないようです。
天才的なアイデアを持っている PHP 関係者はいますか?
更新:この質問でタンブルウィード バッジを獲得しました。

4

1 に答える 1

1

わかった、それは強烈だった。長い話を短くするために、imagecopymergeはアルファチャネルを適切に処理しません。代わりに、各行の不透明度を下げるために、フィルターでimagefilterを使用する必要があります。IMG_FILTER_COLORIZEこのコードは現在、Image_GD(BSDライセンス)の一部です。コードをできるだけ明確にするように努めましたが、ご不明な点がありましたらお知らせください。

KohanaImageライブラリを使用した使用法は次のように機能します。

// Makes a 20px tall reflection with a starting opacity of 100%
// and overwrites the original image with the new one
Image::factory($image_file)->reflection(20, 100)->save();

本当に重要なビットは、実際の行ごとのグラデーションの作成を処理する行265-287です。のすべてのインスタンスは、(およびfor )$this->widthに変換できます。既存のイメージから作成されたGDリソースを指します。imagesx($image)imagesy$this->height$this->_image

ああ、画像をPNGとしてレンダリングするか、グラデーションアルファが正しく機能しないことを確認してください... :)

于 2009-07-15T20:36:58.540 に答える