2009-07-07 18 views
1

さて、私はGD Imageを数ヶ月間ハッキングしていましたが、これで達成したいのは、既存の画像を取り込んでスクリプトを作成することでしたその下の半透明にフェードアウトする反射。
以下ガイドは、不透明色でそれを行う方法を示しています。そのフォーラムでTalkPHP Forums Link

、Rendairは、以下のPHPコードで、色を使用して動的に描画された勾配をオーバーレイする方法を記載している:PHP GDでの半透明画像のリフレクション

// 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行ずつ適用するのは難しいようです。これまでは、イメージの小さなスライス(1行は大きい)しか作成できず、透明にオーバーレイすることはできません。各行をもう少しフェードアウトするようには見えません。だから私の意図した結果は最初の画像でなければならず、100%アルファ透明にフェードする反射コピーがありますが、これを達成できないようです。
天才のアイデアを持っているPHPの人は誰ですか?
更新:この質問は私にtumbleweedバッジを与えました。

+0

は、これは非常にクールなアイディアだと私はそれのためのソリューションを持っている_think_ ...私はいくつかのコードをテストして戻ってくるでしょう。 – shadowhand

+0

ああ、私は尋ねたはずのことは...画像の高さを倍にしたいのですか(上記の標準画像、下に反転して、色あせています)? – shadowhand

+0

どちらかが問題ありません。可能であれば、それを半分の大きさに圧縮します。マスクを適用する方法や、一度に1行ずつレンダリングしたり、不透明度を下げる必要がある場合や、対数関数を使用してスムーズに行ったりする必要がある場合は、私の問題点は私はそれが1つの行を過ぎ去らせるように見えることはできません、私はそれが1つのコピーをinterperetingするような方法で何かを書いているに違いありません。 – NateDSaint

答えて

1

大丈夫です。長い話を短くするために、imagecopymergeはアルファチャンネルを適切に処理しません。代わりに、IMG_FILTER_COLORIZEフィルタにimagefilterフィルタを使用して、各行の不透明度を下げる必要があります。このコードは現在Image_GD(BSDライセンス)の一部です。できるだけ明確にコードを作成しようとしましたが、質問がある場合はお知らせください。 Kohanaのイメージライブラリを使用して

使い方は次のように機能します。

// 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、です。 $this->widthのすべてのインスタンスは、imagesx($image)$this->heightの場合はimagesy)に変換できます。 $this->_imageは、既存のイメージから作成されたGDリソースを指します。

ああ、あなたはPNGまたは正常に動作しません勾配アルファとして画像をレンダリングすることを確認してください... :)

+0

恐ろしい!私は今これをupvotingしていますが、私はそれを確認し、それを動作させるようにしたら、それを受け入れます。 – NateDSaint

+0

実際、「できるだけ明確なコードを作成しようとしました」というコードサンプルがありましたが、この回答には何も表示されませんでした。 – NateDSaint

+0

私の答えが例で更新されました...必要に応じて、クラスからメソッドを単一の関数として抽出できます。 – shadowhand