2011-07-31 17 views
10

Quiero recortar una imagen desde el centro en el tamaño 200 * 130 La imagen que se va a recortar puede variar en tamaño, si la imagen es más pequeña no la recortaré Sé cómo esta parte donde puede comprobar la altura y con la imagen, pero tipo de golpeado en la forma de recortar desde el centro de la imagen Como no puedo averiguar cómo mantener el centro como punto de recorte y que fuera recortarloRecortar imagen del centro PHP

Respuesta

31

GD viene incluido con todas las instalaciones de PHP desde la versión 4.3.6 en adelante, así que lo más probable es que usted lo tenga.

He aquí los pasos que debe tomar ...

  1. Crear un recurso de imagen usando una de las funciones GD imagecreatefrom*(). El que se utiliza depende del tipo de imagen que está tratando con
  2. determinar las dimensiones de imagen mediante imagesx() y imagesy()
  3. Determine su cosecha de coordenadas utilizando el siguiente algoritmo y de los cultivos usando imagecopy()

Encuentra las coordenadas de los cultivos

$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); 

Siéntase libre de utilizar mi clase de manipulación de imágenes, se debe hacer algunos aspectos mucho más fácil - https://gist.github.com/880506

$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

Felicitaciones, eso es increíble y funciona de manera excelente.THanks – June

+0

En el primer algoritmo, ¿qué variables corresponderían a los parámetros correctos de imagecopy()? –

+0

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

0

Esto podría ayudarle .

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); 
} 

Supongo que está utilizando la biblioteca de GD. $ img es una imagen GD, $ w y $ h son el ancho y el alto, respectivamente, que desea que tenga su nueva imagen. En su caso, $ w = 200, $ h = 130.

+0

No, no tengo la biblioteca de GD disponible conmigo – June

+1

@June GD está incluido en la mayoría de las instalaciones de php, use 'phpinfo()' y lo verá probablemente –

+0

¿Puede ayudarme a crear arriba con NO GD Library y guardar la ¿imagen? – June

1

Por Dios, ¿por qué lo haces de la manera difícil? Simplemente basta con establecer las posiciones X e Y como la cantidad de recortar/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)]); 

aviso cómo utilicé mi $ imageSize [0] * (9/16), que es la cantidad que estoy de recorte haciendo en la ordenada dirección, y restamos eso de la altura de la imagen original para encontrar la cantidad de cultivo, luego dividimos entre 2. Si quieres hacer lo mismo para el ancho, simplemente sigue los mismos pasos.