15

PHPを使用して画像にドロップシャドウを追加する方法を探しています。回答または投票して終了する前に:CSSまたはHTMLを使用してこれを行うことは考えていません。画像ファイルを生成したい。これは、この質問とこの質問の重複ではありませ

非常に特殊な効果を探しています。たとえば、次の入力画像があるとします。

画像です!

次の画像を作成したいと思います。

ドロップシャドウ付きの画像です!


TL; DR:上の画像は、Photoshopのドロップシャドウ効果を使用して生成されました。私はそれに非常に似た外観が欲しいです。参考までに、設計チームが使用した設定は次のとおりです。理想的には、角度、距離、不透明度などをコードで同様に制御できます。

Photoshopの設定です。

私はdebian-linusベースのサーバーに完全にアクセスできるので、GDまたはImageMagickソリューションはすべて機能します。他のFOSSLinuxソフトウェアソリューションと同様に、IMまたはGDはすでにインストールされており、新しいソフトウェアをインストールする必要がないため、IMまたはGDでそれを行う方法をお勧めします。

影は、透明で長方形ではないPNGに配置できる必要があります。

私が質問しているのは、主に、Webで見つけたスクリプトとソリューションが、長方形の影しか生成しないか、まるでうんちのように見えるか、まったく機能しないためです。

4

6 に答える 6

20

念のために(答えられて受け入れられたことは知っています):数か月前、ソースファイルが失われたPNGからマスクを回復することについてのグラフィックデザインstackexchangeに関する質問に答えて、PHPを使用するものを一緒に叩きましたGD 関数は、透明な PNG からアルファ チャネルを抽出します。上記のコメントの Joe のように、アルファ チャネルをドロップ シャドウとして使用し、x ピクセルと y ピクセルだけオフセットしてから、画像畳み込みぼかしフィルターを適用し、元の画像をコピーマージできます。次のコードはおそらく SLOW で概念実証ですが、これは開始点であり、最初に要求されたように PHP で作成されています。

<?php

$im = imagecreatefrompng('./images/alphatest_nolayer.png');
$w = imagesx($im);
$h = imagesy($im);

$om = imagecreatetruecolor($w,$h);

for ($x = 0; $x < $w; $x++) {
    for ($y = 0; $y < $h; $y++) {
        $rgb = imagecolorat($im, $x, $y);
        $colors = imagecolorsforindex($im,  $rgb);

        $orgb = imagecolorallocate($om,$colors['alpha'],$colors['alpha'],$colors['alpha']);
        imagesetpixel($om,$x,$y,$orgb);
    }
}

header('Content-Type: image/png');
imagepng($om);

imagedestroy($om);
imagedestroy($im);

?>
于 2011-09-02T21:57:16.253 に答える
10

実際、これはイメージ マジックの変換で実行できます。GD ライブラリは必要ありません。

<?php
    $cmd = 'convert /path/to/source.png \( +clone -background black -shadow 80x3+4+4 \) \+swap -background none -layers merge +repage /path/to/destination.png';
    exec($cmd);
?>

シャドウ パラメータで少し遊ぶことができます。

-shadow percent-opacity{xsigma}{+-}x{+-}y{%}

結果

于 2012-07-27T10:12:12.167 に答える
6

PHP でこれを行うには、完全なエッジ検出アルゴリズムとかなりの処理オーバーヘッドを構築する必要があります。script-fu でGIMPを使用することを検討し、大変な作業は GIMP に任せてください。

于 2011-09-02T19:13:13.430 に答える
6

私は Marc B のアドバイスを利用し、GIMP にこれを行うように依頼しました。他の誰かが気になる場合は、私が使用したコードを次に示します。

/**
 * Call upon The GIMP to apply a dropshadow to a given image.
 * 
 * NOTE: This will overwrite the image file at $filename! Be sure to make a copy
 * of this file first if you need one.
 * 
 * @param string $filename
 * @param int $offset_x
 * @param int $offset_y
 * @param float $radius
 * @param array $color
 * @param int $opacity
 * @return type 
 * @todo Resize the canvas so there's room to apply dropshadows to images which have no whitespace around them.
 */
function apply_gimp_dropshadow($filename,$offset_x=8,$offset_y=8,$radius=15,$color=false,$opacity=40)
{
    if(!is_array($color))
        $color = array(0,0,0);
    $color = join(' ',$color);

    $gimpScript = <<<END_OF_SCHEME_CODE_OH_HOW_I_HATE_YOU_SCHEME
(define (dropshadow filename)
  (let* (
      (image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
      (drawable (car (gimp-image-get-active-layer image)))
    )
    (script-fu-drop-shadow image drawable 8 8 15 '($color) 40 FALSE)
    (set! drawable (car (gimp-image-merge-visible-layers image 0)))
    (gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
    (gimp-image-delete image)
  )
)

(dropshadow "$filename")
(gimp-quit 0)
END_OF_SCHEME_CODE_OH_HOW_I_HATE_YOU_SCHEME;

    $descriptorspec = array(
        0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
        1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
    );

    $cwd = '/tmp';
    $gimp = proc_open('/usr/bin/gimp -i -b -', $descriptorspec, $pipes, $cwd);

    if (!is_resource($gimp))
        throw new Exception('Could not open a pipe to GIMP');

    fwrite($pipes[0], $gimpScript);
    fclose($pipes[0]);

    $gimpOutput = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $gimpResult = proc_close($gimp);

    return $gimpResult;
}
于 2011-09-02T21:19:52.980 に答える
3

PHPs GD 画像処理ライブラリを使用できます

これは、影の効果を追加する方法に関するチュートリアルですただし、これがニーズに合わない場合は、「PHP GD Drop Shadow」をグーグルで検索するとうまくいくと確信しています。

于 2011-09-02T19:18:18.817 に答える