Хорошо, в основном я хочу, чтобы все изображения были квадратами 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); }
Нуждается в некоторой работе, но она должна дать вам достаточно для начала.
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
, взятые из руководства :
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] ); }
хорошо, вот рабочий;
<? $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);
Вы используете ImageMagic? Если нет, вы должны. http://php.net/manual/en/book.imagick.php
Вы можете попробовать это, но я пока не знаю, но это выглядит многообещающе. http://phpthumb.sourceforge.net/