php如何裁剪图像然后拉伸以防止黑条

时间:2013-11-13 00:12:00

标签: php

我正在寻找裁剪裁剪图像的方形,但如果图像的比例为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

2 个答案:

答案 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}]);

希望你觉得这很有帮助..快乐的编码:)