Почему мое изображение растягивается, когда я обрезаю его?

Я использую следующий фрагмент кода, чтобы обрезать изображение?

function crop($width,$height) { $new_image = imagecreatetruecolor($width, $height); imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $this->getWidth(), $this->getHeight(), $width, $height ); $this->image = $new_image; } 

Здесь $this->image – это исходное изображение $this->getWidth() и $this->getHeight() содержит исходные размеры изображения, где в качестве $width и $height – область урожая.

Но по какой-то причине изображение обрезки изменяется (мы можем почти сказать, что оно изменяется).

Как это исправить?

Ну, проблема заключается в предоставлении исходных измерений. Придание размеров всего изображения будет изменяться, а не обрезать.

Это должно решить проблему

  function crop($width,$height) { $new_image = imagecreatetruecolor($width, $height); imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $width, $height ); $this->image = $new_image; } 

Да, у меня есть решение для загрузки загруженного изображения и изменения размера без крахмала, пожалуйста, выполните следующие действия:

Шаг 1: вы создаете новый файл index.php.

 <html> <body> <form action="image_upload.php" method="POST" enctype="multipart/form-data"> <input type="file" name="image" /> <input type="submit"/> </form> </body> </html> 

Шаг 2: затем создайте новый файл resize.php

 <?php Class resize { // *** Class variables private $image; private $width; private $height; private $imageResized; function __construct($fileName) { // *** Open up the file $this->image = $this->openImage($fileName); // *** Get width and height $this->width = imagesx($this->image); $this->height = imagesy($this->image); } ## -------------------------------------------------------- public static function openImage($file) { // *** Get extension $extension = strtolower(strrchr($file, '.')); switch($extension) { case '.jpg': case '.jpeg': $img = @imagecreatefromjpeg($file); break; case '.gif': $img = @imagecreatefromgif($file); break; case '.png': $img = @imagecreatefrompng($file); break; default: $img = false; break; } return $img; } ## -------------------------------------------------------- public function resizeImage($newWidth, $newHeight, $option="auto") { // *** Get optimal width and height - based on $option $optionArray = $this->getDimensions($newWidth, $newHeight, $option); $optimalWidth = $optionArray['optimalWidth']; $optimalHeight = $optionArray['optimalHeight']; // *** Resample - create image canvas of x, y size $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight); imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height); // *** if option is 'crop', then crop too if ($option == 'crop') { $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight); } } ## -------------------------------------------------------- public function getDimensions($newWidth, $newHeight, $option) { switch ($option) { case 'exact': $optimalWidth = $newWidth; $optimalHeight= $newHeight; break; case 'portrait': $optimalWidth = $this->getSizeByFixedHeight($newHeight); $optimalHeight= $newHeight; break; case 'landscape': $optimalWidth = $newWidth; $optimalHeight= $this->getSizeByFixedWidth($newWidth); break; case 'auto': $optionArray = $this->getSizeByAuto($newWidth, $newHeight); $optimalWidth = $optionArray['optimalWidth']; $optimalHeight = $optionArray['optimalHeight']; break; case 'crop': $optionArray = $this->getOptimalCrop($newWidth, $newHeight); $optimalWidth = $optionArray['optimalWidth']; $optimalHeight = $optionArray['optimalHeight']; break; } return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); } ## -------------------------------------------------------- public static function getSizeByFixedHeight($newHeight) { $ratio = $this->width / $this->height; $newWidth = $newHeight * $ratio; return $newWidth; } public static function getSizeByFixedWidth($newWidth) { $ratio = $this->height / $this->width; $newHeight = $newWidth * $ratio; return $newHeight; } public static function getSizeByAuto($newWidth, $newHeight) { if ($this->height < $this->width) // *** Image to be resized is wider (landscape) { $optimalWidth = $newWidth; $optimalHeight= $this->getSizeByFixedWidth($newWidth); } elseif ($this->height > $this->width) // *** Image to be resized is taller (portrait) { $optimalWidth = $this->getSizeByFixedHeight($newHeight); $optimalHeight= $newHeight; } else // *** Image to be resizerd is a square { if ($newHeight < $newWidth) { $optimalWidth = $newWidth; $optimalHeight= $this->getSizeByFixedWidth($newWidth); } else if ($newHeight > $newWidth) { $optimalWidth = $this->getSizeByFixedHeight($newHeight); $optimalHeight= $newHeight; } else { // *** Sqaure being resized to a square $optimalWidth = $newWidth; $optimalHeight= $newHeight; } } return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); } ## -------------------------------------------------------- public function getOptimalCrop($newWidth, $newHeight) { $heightRatio = $this->height / $newHeight; $widthRatio = $this->width / $newWidth; if ($heightRatio < $widthRatio) { $optimalRatio = $heightRatio; } else { $optimalRatio = $widthRatio; } $optimalHeight = $this->height / $optimalRatio; $optimalWidth = $this->width / $optimalRatio; return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); } ## -------------------------------------------------------- public function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight) { // *** Find center - this will be used for the crop $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 ); $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 ); $crop = $this->imageResized; //imagedestroy($this->imageResized); // *** Now crop from center to exact requested size $this->imageResized = imagecreatetruecolor($newWidth , $newHeight); imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight); } ## -------------------------------------------------------- public function saveImage($savePath, $imageQuality="100") { // *** Get extension $extension = strrchr($savePath, '.'); $extension = strtolower($extension); switch($extension) { case '.jpg': case '.jpeg': if (imagetypes() & IMG_JPG) { imagejpeg($this->imageResized, $savePath, $imageQuality); } break; case '.gif': if (imagetypes() & IMG_GIF) { imagegif($this->imageResized, $savePath); } break; case '.png': // *** Scale quality from 0-100 to 0-9 $scaleQuality = round(($imageQuality/100) * 9); // *** Invert quality setting as 0 is best, not 9 $invertScaleQuality = 9 - $scaleQuality; if (imagetypes() & IMG_PNG) { imagepng($this->imageResized, $savePath, $invertScaleQuality); } break; // ... etc default: // *** No extension - No save. break; } imagedestroy($this->imageResized); } ## -------------------------------------------------------- } ?> 

Шаг 3: вы также создаете новую две папки: 1) и 2) image_thumb

Шаг 4: затем сделайте новый файл image_upload.php

 <?php include('resize.php'); if(isset($_FILES['image'])){ //set a folder move to orignal images $destinationPath = "image/"; //set a folder move to crop and resizeable images $destinationThumbPath = "image_thumb/"; //uploaded files extension $extension = strtolower(strrchr($_FILES['image']['name'], '.')); //set a new custom name of uploaded file $file_name = "image_".rand('1111','9999').$extension; //move orignal image in Destination Path move_uploaded_file($_FILES['image']['tmp_name'],"image/".$file_name); //set a new thumbnail width $newWidth = 96; //set a new thumbnail height $newHeight = 96; //profile image resize $resizeObj = new resize($destinationPath . $file_name); // *** 2) Resize image (options: exact, portrait, landscape, auto, crop) $resizeObj->resizeImage($newWidth, $newHeight, 'crop'); //crop and resize image save in destination path $resizeObj->saveImage($destinationThumbPath . $file_name, 100); } ?> в <?php include('resize.php'); if(isset($_FILES['image'])){ //set a folder move to orignal images $destinationPath = "image/"; //set a folder move to crop and resizeable images $destinationThumbPath = "image_thumb/"; //uploaded files extension $extension = strtolower(strrchr($_FILES['image']['name'], '.')); //set a new custom name of uploaded file $file_name = "image_".rand('1111','9999').$extension; //move orignal image in Destination Path move_uploaded_file($_FILES['image']['tmp_name'],"image/".$file_name); //set a new thumbnail width $newWidth = 96; //set a new thumbnail height $newHeight = 96; //profile image resize $resizeObj = new resize($destinationPath . $file_name); // *** 2) Resize image (options: exact, portrait, landscape, auto, crop) $resizeObj->resizeImage($newWidth, $newHeight, 'crop'); //crop and resize image save in destination path $resizeObj->saveImage($destinationThumbPath . $file_name, 100); } ?> 

Это то, что делает imagecopyresampled: оно искажает изображение и не обрезает его. Вместо этого попробуйте вообразить.