Изменить размер и обрезать PHP - PullRequest
3 голосов
/ 14 декабря 2010

Хорошо, в основном я хочу, чтобы все изображения были квадратами 170x170px.Таким образом, если изображение не является квадратом, я хочу, чтобы его размер был изменен, а затем обрезан посередине.

Я провел много часов, играя с этим, и у меня ничего не получается .. Я получил его обрезатьчасть большего изображения и т. д., но мне нужно, чтобы изображение было изменено, а затем обрезано.

Любая помощь будет принята с благодарностью.

// get image size of img
$x = @getimagesize($img);
// image width
$sw = $x[0];
// image height
$sh = $x[1];

if($sw > $sh) // Horizontal Rectangle?
{
  $newwidth = ($sw/$sh)*170;
  $newheight=170;   
  $x_pos = ($sw - $sh) / 2;
  $x_pos = ceil($x_pos);
  $y_pos=0;
}

else if($sh > $sw) // Vertical Rectangle?
{
  $newheight = ($sh/$sw)*170;
  $newwidth=170;
  $y_pos = ($sh - $sw) / 2;
  $y_pos = ceil($y_pos);
  $x_pos=0;
}
else //Already Square
{
  $newheight=170;
  $newwidth=170;
}

$im = @ImageCreateFromJPEG ($img) or // Read JPEG Image
$im = @ImageCreateFromPNG ($img) or // or PNG Image
$im = @ImageCreateFromGIF ($img) or // or GIF Image
$im = false; // If image is not JPEG, PNG, or GIF

if (!$im) {
  // We get errors from PHP's ImageCreate functions...
  // So let's echo back the contents of the actual image.
  readfile ($img);
} else {
  // Create the resized image destination
  $thumb = @ImageCreateTrueColor (170, 170);
  // Copy from image source, resize it, and paste to image destination
  imagecopyresampled($thumb, $im, 0, 0, 180, $y_pos, 170, 170, $newwidth, 
    $newheight);
}

Ответы [ 4 ]

4 голосов
/ 15 декабря 2010

хорошо, вот рабочий;

<?
$img = 'leaf.jpg';
// get image size of img
$x = @getimagesize($img);

// image dimensions
$sw = $x[0];
$sh = $x[1];

//dest size
$dSize = 170;

//find smallerst part and get needed scale and offset
$yOff = 0;
$xOff = 0;
if($sw < $sh) {
  $scale = $dSize / $sw;
  $yOff = $sh/2 - $dSize/$scale/2; 
} else {
  $scale = $dSize / $sh;
  $xOff = $sw/2 - $dSize/$scale/2; 
}

$im = @ImageCreateFromJPEG ($img) or // Read JPEG Image
$im = @ImageCreateFromPNG ($img) or // or PNG Image
$im = @ImageCreateFromGIF ($img) or // or GIF Image
$im = false; // If image is not JPEG, PNG, or GIF

if (!$im) {
  // We get errors from PHP's ImageCreate functions...
  // So let's echo back the contents of the actual image.
  readfile ($img);
} else {
  // Create the resized image destination
  $thumb = @ImageCreateTrueColor ($dSize,$dSize);
  // Copy from image source, resize it, and paste to image destination
  imagecopyresampled($thumb, $im, 
    0, 0, 
    $xOff,$yOff,
    $dSize, $dSize, 
    $dSize / $scale ,$dSize / $scale);
}
header('content-type:image/jpeg');
imagejpeg($thumb);
//imagejpeg($im);
2 голосов
/ 14 декабря 2010

Нужна некоторая работа, но она должна дать вам достаточно для начала.

function crop($filename, $width, $height)
{
    // image resource, assuming it's PNG
    $resource = imagecreatefrompng($filename);
    // resource dimensions
    $size = array(
        0 => imagesx($resource),
        1 => imagesy($resource),
    );
    // sides
    $longer  = (int)($size[0]/$width > $size[1]/$height);
    $shorter = (int)(!$longer);
    // ugly hack to avoid condition for imagecopyresampled()
    $src = array(
        $longer  => 0,
        $shorter => ($size[$shorter]-$size[$longer])/2,
    );
    // new image resource
    $new = imagecreatetruecolor($width, $height);
    // do the magic
    imagecopyresampled($new, $resource,
        0,  0,
        $src[0], $src[1],
        $width, $height,
        $size[$longer], $size[$longer]
    );

    // save it or something else :)
}

Редактировать: Попытка объяснить "уродливый взлом" выше.

ДваРассматриваемые параметры $src_x и $src_y, взятые из manual :

imagecopyresampled () получат прямоугольную область из src_image ширины src_w и высоты src_h в позиции (src_x, src_y) и поместите его в прямоугольную область dst_image шириной dst_w и высотой dst_h в позиции (dst_x, dst_y).

Значение, если ширина $filename больше, src_xдолжно быть 0, а если высота больше, src_y должно быть 0.В переводе на код это будет выглядеть примерно так:

$src = ($size[$shorter]-$size[$longer])/2;

if ( $longer === 1 )
{
    imagecopyresampled($new, $resource,
        0,  0,
        $src, 0,
        $width, $height,
        $size[$longer], $size[$longer]
    );
}
else
{
    imagecopyresampled($new, $resource,
        0,  0,
        0, $src,
        $width, $height,
        $size[$longer], $size[$longer]
    );
}
0 голосов
/ 07 апреля 2011

Вы можете попробовать это, я еще не сделал, но это выглядит многообещающе. http://phpthumb.sourceforge.net/

0 голосов
/ 14 декабря 2010

Вы используете ImageMagic?Если нет, вы должны.http://php.net/manual/en/book.imagick.php

...