0

私は画像に遠近法変換を追加するためのGDベースのソリューションを探していましたが、最終的には有望と思われるものを見つけました:http ://www.jqueryit.com/2010/03/set-perspective-of-image-using- php-gd.html

ただし、この関数を使用して実際に新しい画像を生成する方法がわかりません。私のアプローチはこれでした:

function perspective($i,$gradient=0.85,$rightdown=true,$background=0xFFFFFF) {
    $mult=5;
    $w=imagesx($i);
    $h=imagesy($i);
    $image=imagecreatetruecolor($w*$mult,$h*$mult);
    imagecopyresized($image,$i,0,0,0,0,$w*$mult,$h*$mult,$w,$h);
    imagedestroy($i);
    $w*=$mult;
    $h*=$mult;
    $im=imagecreatetruecolor($w,$h);
    $background=imagecolorallocate($im,($background>>16)&0xFF,($background>>8)&0xFF,$background&0xFF);
    imagefill($im,0,0,$background);
    imageantialias($im,true);
    $nh=$h-($h*$gradient);
    for ($x=0; $x<$w; $x++) {
        $ni=(($rightdown) ? $x : $w-$x);
        $p=intval($h-(($ni/$w)*$nh));
        if (($p%2)<>0)
            $p-=1;
        $nx=intval(($p-$h)/2);
        imagecopyresampled($im,$image,$x,0,$x,$nx,1,$p,1,$h-1);
        imageline($im,$x,0,$x,-$nx-1,$background);
        imageline($im,$x,$h-1,$x,$h+$nx,$background);
    }
    imagedestroy($image);
    imagefilter($im,IMG_FILTER_SMOOTH,10);
    $i=imagecreatetruecolor($w/$mult,$h/$mult);
    imageantialias($i,true);
    imagecopyresampled($i,$im,0,0,0,0,$w,$h,$w*$mult,$h*$mult);
    imagedestroy($im);
    return $i;
}

$image = perspective("my_image.jpg");

imagejpeg($image , "my_image_converted.jpg");

そして残念ながら、それは出力を生成しませんでした。私が間違っているのは何ですか?

4

2 に答える 2

1

関数が画像リソースを必要とする場合、ファイル名だけを渡すことはできないためです。試す:

$image = perspective(imagecreatefromjpeg("my_image.jpg"));

リンクから取得した関数を読み、imagecopyresized()が呼び出された場所を具体的に見てください。

于 2012-08-07T15:54:29.227 に答える
0

表示しようとしているだけの場合は、ヘッダーを変更して画像をエコーできるはずです。

header("Content-Type: image/jpg");
echo imagejpeg($image , "my_image_converted.jpg");

クライアント ブラウザは、他の jpg と同様にこれをロードします。

于 2012-08-07T15:54:07.197 に答える