2011-07-31 11 views
10

サイズ200 * 130の画像を切り抜きたい画像が小さい場合は切り取る画像のサイズが異なる場合があります私たちは切り抜きません私はこの部分をどのように知っていますか画像の高さや高さを確認できますが、画像の中央からトリミングのものにぶつかってしまいます センターをクロップポイントとして保持し、外向きの作物とする方法を理解できません。画像を切り抜く中央からPHP

答えて

31

GDはバージョン4.3.6以降のすべてのPHPインストールにバンドルされていますので、可能性があります。ここで

はあなたが取る必要がある手順です...

  1. GD imagecreatefrom*()関数のいずれかを使用してイメージリソースを作成します。あなたが使用して1 imagesx()を使用して画像のサイズを決定し、あなたが
  2. を扱っている画像の種類に依存し、imagesy()
  3. は、あなたの作物がimagecopy()

作物の座標を検索を使用して、次のアルゴリズムと作物を使用して座標決定しますhttps://gist.github.com/880506

-

$width = imagesx($img); 
$height = imagesy($img); 
$centreX = round($width/2); 
$centreY = round($height/2); 

$cropWidth = 200; 
$cropHeight = 130; 
$cropWidthHalf = round($cropWidth/2); // could hard-code this but I'm keeping it flexible 
$cropHeightHalf = round($cropHeight/2); 

$x1 = max(0, $centreX - $cropWidthHalf); 
$y1 = max(0, $centreY - $cropHeightHalf); 

$x2 = min($width, $centreX + $cropWidthHalf); 
$y2 = min($height, $centreY + $cropHeightHalf); 

私のイメージ操作クラスを使用すること自由に感じ、それははるかに簡単にいくつかの側面を行う必要があります

$im = new ImageManipulator('/path/to/image'); 
$centreX = round($im->getWidth()/2); 
$centreY = round($im->getHeight()/2); 

$x1 = $centreX - 100; 
$y1 = $centreY - 65; 

$x2 = $centreX + 100; 
$y2 = $centreY + 65; 

$im->crop($x1, $y1, $x2, $y2); // takes care of out of boundary conditions automatically 
$im->save('/path/to/cropped/image'); 
+1

帽子が外れています。THanks – June

+0

最初のアルゴリズムでは、どの変数がimagecopy()の正しいパラメータに対応するでしょうか? –

+0

@ChrisHarrison https://gist.github.com/philBrown/880506#file-imagemanipulator-php-L185 – Phil

0

これは役立ちます。

function cropCentered($img, $w, $h) 
{ 
    $cx = $img->getWidth()/2; 
    $cy = $img->getHeight()/2; 
    $x = $cx - $w/2; 
    $y = $cy - $h/2; 
    if ($x < 0) $x = 0; 
    if ($y < 0) $y = 0; 
    return $img->crop($x, $y, $w, $h); 
} 

私はあなたのGDライブラリを使用していると仮定しています。 $ imgはGD画像、$ wと$ hはそれぞれ新しい画像に必要な幅と高さです。あなたのケースでは、$ w = 200、$ h = 130です。

+0

いいえ私と一緒に利用できるGDライブラリを持っていません – June

+1

@June GDはほとんどのphpインストールに含まれています、 'phpinfo()'を使用し、おそらくそれを見ます –

+0

NO GDライブラリで上記を作成し、画像? – June

1

ええ、なぜあなたはそれを難し​​い方法でやっていますか?ただ単に私がYにすることにより、トリミングしています量である私の$ IMAGESIZE [0] *を(9/16)、使用方法/ 2

$imageSize = getimagesize('thumbnail.png'); 

$croppedImage = imagecrop(imagecreatefrompng('thumbnail.png'), ['x' => 0, 'y' => ($imageSize[1]-$imageSize[0]*(9/16))/2, 'width' => $imageSize[0], 'height' => $imageSize[0]*(9/16)]); 

通知をトリミングする量として、xとyの位置を設定します元の画像の高さから減算して作物量を求め、2で割ったものです。幅を同じにしたい場合は、同じ手順を実行します。

関連する問題