2013-11-13 4 views
2

Я ищу решение изображений обрезки до квадрата, но результат имеет проблему с черной полосой с обеих сторон, если отношение изображения к 0 велико.php как обрезать изображение, затем растянуть, чтобы предотвратить черную полосу

eg: 
croped 
http://static.xaluan.com/images/news/Image/2013/11/13/med_15282b4691c7e6.img.jpg 
original 
http://static.xaluan.com/images/news/Image/2013/11/1315282b4691c7e6.img.jpg 

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

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

  $src_width= ImagesX($src_img); 
      $src_height= ImagesY($src_img); 
      $dest_width = $insize; 
      $dest_height = $src_height/($src_width/$dest_width); 
      if ($cropYes == 1){ 
         if($src_width > $src_height) $biggestSide = $src_width; //find biggest length 
         else $biggestSide = $src_height; 
         $cropPercent = .7; // This will zoom in to 70% zoom (crop) 
         $cropWidth = $biggestSide*$cropPercent; 
         $cropHeight = $biggestSide*$cropPercent; 
         $xcrop = ($src_width-$cropWidth)/2; 
         if ($src_width >= $src_height){ 
         $ycrop = ($src_height-$cropHeight)/2; //use this if need from center 
         } else {$ycrop = 0; }//set crop from top images 
      $dest_img = ImageCreateTrueColor($dest_width, $dest_width); 
      ImageCopyResampled($dest_img, $src_img, 0, 0, $xcrop, $ycrop, $dest_width, $dest_width, $cropWidth, $cropHeight); 
//   $white = imagecolorallocate($dest_img, 255, 255, 255); 
//   imagefill($dest_img, 0, 0, $white); // set backgound to white 
+0

'пример оригинального image' был теперь удален ~~, можно вы обновляете еще один доступный пример изображения? –

ответ

1

Попробуйте этот код Sven Koschnicke:

//Your Image 
$imgSrc = "image.jpg"; 

//getting the image dimensions 
list($width, $height) = getimagesize($imgSrc); 

//saving the image into memory (for manipulation with GD Library) 
$myImage = imagecreatefromjpeg($imgSrc); 

// calculating the part of the image to use for thumbnail 
if ($width > $height) { 
    $y = 0; 
    $x = ($width - $height)/2; 
    $smallestSide = $height; 
} else { 
    $x = 0; 
    $y = ($height - $width)/2; 
    $smallestSide = $width; 
} 

// copying the part into thumbnail 
$thumbSize = 100; 
$thumb = imagecreatetruecolor($thumbSize, $thumbSize); 
imagecopyresampled($thumb, $myImage, 0, 0, $x, $y, $thumbSize, $thumbSize, $smallestSide, $smallestSide); 

//final output 
header('Content-type: image/jpeg'); 
imagejpeg($thumb); 

Источник: PHP crop image to fix width and height without losing dimension ratio

1

Я написал класс для работы с изображениями , сохраните это как файл php и включите в свой код:

Class Resize { 

//Variables 
private $image; 
private $width; 
private $height; 
private $imageResized; 
private $imageAplha; 

function __construct($fileName, $tmpFile = NULL) { 
    //Open Image 
    $this->image = $this->openImage($fileName, $tmpFile); 

    //Get width and height 
    $this->width = imagesx($this->image); 
    $this->height = imagesy($this->image); 
} 

private function openImage($file, $tmpFile = NULL) { 
    //Get extension 
    $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); 

    if ($tmpFile != NULL) { 
     $cfile = $tmpFile; 
    } else { 
     $cfile = $file; 
    } 

    switch ($extension) { 
     case 'jpg': 
     case 'jpeg': 
      $img = @imagecreatefromjpeg($cfile); 
      $this->imageAplha = false; 
      break; 
     case 'gif': 
      $img = @imagecreatefromgif($cfile); 
      $this->imageAplha = false; 
      break; 
     case 'png': 
      $img = @imagecreatefrompng($cfile); 
      imagealphablending($img, true); 
      $this->imageAplha = true; 
      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 w, h size 
    $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight); 

    if ($this->imageAplha) { 

     imagealphablending($this->imageResized, false); 
     imagesavealpha($this->imageResized, true); 
    } 

    imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height); 


    //If CROP 
    if ($option == 'crop') { 
     $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight); 
    } 
} 

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

private function getSizeByFixedHeight($newHeight) { 
    $ratio = $this->width/$this->height; 
    $newWidth = $newHeight * $ratio; 
    return $newWidth; 
} 

private function getSizeByFixedWidth($newWidth) { 
    $ratio = $this->height/$this->width; 
    $newHeight = $newWidth * $ratio; 
    return $newHeight; 
} 

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

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

private 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; 

    //Now crop from center to exact requested size 
    $this->imageResized = imagecreatetruecolor($newWidth, $newHeight); 

    if ($this->imageAplha) { 

     imagealphablending($this->imageResized, false); 
     imagesavealpha($this->imageResized, true); 
    } 

    imagecopyresampled($this->imageResized, $crop, 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight, $newWidth, $newHeight); 
} 

public function saveImage($savePath, $imageQuality = "100") { 
    //Get extension 
    $extension = strtolower(pathinfo($savePath, PATHINFO_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; 

     default: 
      //No extension - No save. 
      break; 
    } 

    imagedestroy($this->imageResized); 
} 

} 

Вы можете позвонить и изменить размер/обрезать изображение с помощью:

$resizeObj = new resize([filetomanipulate]); 
$resizeObj->resizeImage([width], [height], [exact, portrait, landscape, auto, crop]); 
$resizeObj->saveImage([outputfilename], [quality{0-100}]); 

Надеется, что вы нашли это полезный .. С Днем кодированием :)

Смежные вопросы