我正在寻找裁剪裁剪图像的方形,但如果图像的比例为0,则结果会出现黑边的问题。
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
我尝试过用其他颜色填充黑条的解决方案,但效果不是很好。
所以我想到裁剪之后,图像需要在笨拙中伸展一点,所以人们没有注意到在嘟嘟声中改变图像但是黑条会消失会很好。 请帮忙解决这个问题 谢谢 遵循我的代码:
$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 :(得分: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 :(得分: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}]);
希望你觉得这很有帮助..快乐的编码:)