PHP GD - Как я могу изменить Thumbnail Creator для обрезки портретных изображений из центра? - PullRequest
2 голосов
/ 21 мая 2010

Вот мой текущий код:

$image  = 'img.jpg';
$source = imagecreatefromjpeg($image);

list($origWidth, $origHeight) = getimagesize($image);

$imgH   = 75;
$imgW   = $origWidth / $origHeight * $imgH;
$thumb  = imagecreatetruecolor($imgW, $imgH);

imagecopyresampled($thumb, $source, 0, 0, 0, 0, $imgW, $imgH, $origWidth, $origHeight);

Это позволяет мне выводить изображение с фиксированной высотой 75 пикселей. То, что я хотел бы сделать, это иметь постоянный размер изображения 99x75 пикселей. Портретные изображения, которые не вписываются в это, будут обрезаны по центру (поэтому центр оригинала остается центром эскиза - если это имеет смысл).

Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 21 мая 2010

Ну, это чистая математика. Вы хотите достичь размера 99x75, и вы хотите вырезать только из ширины. Итак, во-первых, вы изменяете размер, чтобы соответствовать высоте. Это то, что вы сделали, но сделали это, чтобы соответствовать высоте 75. Переключите его на 99. Затем проверьте ширину <= 75. Если это не так, вы сделаете это: </p>

if( $imgW > 75 )
{
   $diff   = $imgw - 75; // this is what's extra
   $srcX   = ceil( $diff / 2 ); // this is where your img starts from
   $imgW   = 75;
}
imagecopyresampled($thumb, $source, 0, 0, $srcX, 0, $imgW, $imgH, $origWidth, $origHeight); // notice that src X changed accordingly.

Итак, если ширина после первого «изменения размера» равна 100, а вы хотите 75, вы вычисляете diff = 25, делите его на 2 и получаете значение => 13, тогда вы говорите функции GD начать копирование изображения от 13, а не от 0, и все равно держите 75 высоту. Это означает, что он будет копировать с ширины 13 до 88 => центра.

Надеюсь, это то, что вы хотели. С Уважением, Gabriel

1 голос
/ 24 мая 2010
define( 'THUMB_WIDTH',  99 );
define( 'THUMB_HEIGHT', 75 );

$image = imagecreatefromjpeg('img.jpg');
$thumb = imagecreatetruecolor(THUMB_WIDTH, THUMB_HEIGHT);

list($image_width, $image_height) = getimagesize($image);
$x0 = ( $image_width  - THUMB_WIDTH  ) / 2;
$y0 = ( $image_height - THUMB_HEIGHT ) / 2;
imagecopy(
    $thumb,      // resource $dst_im
    $image,      // resource $src_im
    0,           // int $dst_x
    0,           // int $dst_y
    $x0,         // int $src_x
    $y0,         // int $src_y
    THUMB_WIDTH, // int $src_w
    THUMB_HEIGHT // int $src_h  
);

Этот код использует функцию imagecopy для копирования области 99x75px из исходного изображения. Source source - 99/2 возвращает координату x, с которой начинается копирование, Source height - 75/2 возвращает координату y. Если вы заинтересованы в создании миниатюр фиксированного размера из изображений произвольного размера, посмотрите эту статью .

0 голосов
/ 21 мая 2010

(не проверено)

define('THUMB_WIDTH', 99);
define('THUMB_HEIGHT', 75);

$image  = 'img.jpg';
$source = imagecreatefromjpeg($image);
$thumb  = imagecreatetruecolor(THUMB_WIDTH, THUMB_HEIGHT);

$cutX = imagesx($source) > THUMB_WIDTH;
$cutY = imagesy($source) > THUMB_HEIGHT;

$source_x = $cutX ? imagesx($source) / 2 - (THUMB_WIDTH/2) : 0;
$source_y = $cutY ? imagesx($source) / 2 - (THUMB_HEIGHT/2) : 0;
$source_width = $cutX ? THUMB_WIDTH : imagesx($source);
$source_height = $cutY ? THUMB_HEIGHT : imagesy($source);

imagecopyresampled($thumb, $source, 0, 0, $source_x, $source_y, $source_width, $source_height, THUMB_WIDTH, THUMB_HEIGHT);
...