PHP图像调整大小会切断我的图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP图像调整大小会切断我的图像相关的知识,希望对你有一定的参考价值。

我这里有这个功能.....

function create_thumbnail($source,$destination, $thumb_width) {
        $size = getimagesize($source);
        $width = $size[0];
        $height = $size[1];
        $x = 0;
        $y = 0;
        if($width> $height) {
            $x = ceil(($width - $height) / 2 );
            $width = $height;
        } elseif($height> $width) {
            $y = ceil(($height - $width) / 2);
            $height = $width;
        }
        $new_image = imagecreatetruecolor($thumb_width,$thumb_width)or die('Cannot Initialize new GD image stream');
        $extension = get_image_extension($source);
         if($extension=='jpg' || $extension=='jpeg') 
            $image = imagecreatefromjpeg($source); 
        if($extension=='gif') 
            $image = imagecreatefromgif($source); 
        if($extension=='png') 
            $image = imagecreatefrompng($source);   

        imagecopyresampled($new_image,$image,0,0,$x,$y,$thumb_width,$thumb_width,$width,$height);
        if($extension=='jpg' || $extension=='jpeg') 
           imagejpeg($new_image,$destination); 
        if($extension=='gif') 
            imagegif($new_image,$destination); 
        if($extension=='png') 
            imagepng($new_image,$destination); 
    }

这需要一个图像和调整大小,但它没有调整我预期的方式,我期待它将需要一个宽图像或高图像或正常大小的图像,并切断它,使其适合这个大小,它确实调整大小,但它切断了我的大部分图像......我一直在努力解决这个问题几天,我似乎无法找到一种方法来调整我的图像大小而不会切断它们....我希望我能找到一些帮助它会非常感激...所以,太累了....

举个例子,我有这个图像....

当我为该图像运行该函数时,它返回...

我期待的是相同的图像,只是更小。

我改变了我的代码的这一部分......

imagecopyresampled($new_image,$image,0,0,0,0,$thumb_width,$thumb_width,$width,$height);

$x$y改为'0'和'0',这就是......

我接近我正在寻找的东西,但完整的图像不存在......它仍然被切断了。

答案

你想要什么,你可以使用这个功能:

function create_thumbnail($source, $destination, $thumbWidth)
{
    $extension = get_image_extension($source);
    $size = getimagesize($source);
    $imageWidth  = $newWidth  = $size[0];
    $imageHeight = $newheight = $size[1];

    if ($imageWidth > $thumbWidth || $imageHeight > $thumbWidth)
    {
        $newWidth  = $newHeight = $thumbWidth;
    }

    $newImage = imagecreatetruecolor($newWidth, $newHeight);

    switch ($extension)
    {
        case 'jpeg':
        case 'jpg':
            $imageCreateFrom = 'imagecreatefromjpeg';
            $store = 'imagejpeg';
            break;

        case 'png':
            $imageCreateFrom = 'imagecreatefrompng';
            $store = 'imagepng';
            break;

        case 'gif':
            $imageCreateFrom = 'imagecreatefromgif';
            $store = 'imagegif';
            break;

        default:
            return false;
    }

    $container = $imageCreateFrom($source);
    imagecopyresampled($newImage, $container, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight);
    return $store($newImage, $destination);
}
var_dump(create_thumbnail('sample.jpg', 'sample_thumb_no_ratio.jpg', '255'));

但是,如果要保留图像比例,可以使用以下内容:

function create_thumbnail_preserve_ratio($source, $destination, $thumbWidth)
{
    $extension = get_image_extension($source);
    $size = getimagesize($source);
    $imageWidth  = $newWidth  = $size[0];
    $imageHeight = $newheight = $size[1];

    if ($imageWidth > $thumbWidth || $imageHeight > $thumbWidth)
    {
        // Calculate the ratio
        $xscale = ($imageWidth/$thumbWidth);
        $yscale = ($imageHeight/$thumbWidth);
        $newWidth  = ($yscale > $xscale) ? round($imageWidth * (1/$yscale)) : round($imageWidth * (1/$xscale));
        $newHeight = ($yscale > $xscale) ? round($imageHeight * (1/$yscale)) : round($imageHeight * (1/$xscale));
    }

    $newImage = imagecreatetruecolor($newWidth, $newHeight);

    switch ($extension)
    {
        case 'jpeg':
        case 'jpg':
            $imageCreateFrom = 'imagecreatefromjpeg';
            $store = 'imagejpeg';
            break;

        case 'png':
            $imageCreateFrom = 'imagecreatefrompng';
            $store = 'imagepng';
            break;

        case 'gif':
            $imageCreateFrom = 'imagecreatefromgif';
            $store = 'imagegif';
            break;

        default:
            return false;
    }

    $container = $imageCreateFrom($source);
    imagecopyresampled($newImage, $container, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight);
    return $store($newImage, $destination);
}
var_dump(create_thumbnail_preserve_ratio('sample.jpg', 'sample_thumb_with_ratio.jpg', '255'));
另一答案

其他方案:

/**
 * Create a jpg thumbnail from a source
 **/
function create_thumbnail($source, $destination, $thumbWidth) {
    if (($info = getimagesize($source)) === FALSE)
        return null;
    switch ($info[2]) {
        case IMAGETYPE_GIF  : $src = imagecreatefromgif($source);  break;
        case IMAGETYPE_JPEG : $src = imagecreatefromjpeg($source); break;
        case IMAGETYPE_PNG  : $src = imagecreatefrompng($source);  break;
        default : null;
    }
    $width = $info[0];
    $height = $info[1];
    $widthDst = $thumbWidth;
    $heightDst = intval( $height * $thumbWidth / $width);
    $tmp = imagecreatetruecolor($widthDst, $heightDst);
    imagecopyresampled($tmp, $src, 0, 0, 0, 0, $widthDst, $heightDst, $width, $height);
    imagejpeg($tmp, $destination);
}

以上是关于PHP图像调整大小会切断我的图像的主要内容,如果未能解决你的问题,请参考以下文章

php调整图像大小然后裁剪图像问题

在PHP中调整图像大小

使用 PHP 调整图像大小

php imagick调整图像代码无法正常工作

CSS使图像调整大小并适合任何屏幕

调整 UITableViewCell 的大小以适合标签或图像和圆角