laravel图像干预是压缩用户上传图像的好方法吗?

时间:2016-05-25 07:18:17

标签: php image laravel image-compression

我正在检查这个laravel库以压缩用户上传的图像。http://image.intervention.io/

我想知道这对于用户上传的图片(对于个人资料图片)是否是一个好主意?如果用户上传尺寸为1400x600的图片并将其调整为200x200,该怎么办?它会是一个伸展的形象吗?

6 个答案:

答案 0 :(得分:5)

是的,它会被拉长。您想尝试fit()方法:

  

结合裁剪和调整大小以智能方式格式化图像。该   方法将找到您给定宽度的最佳拟合宽高比   自动调整当前图像的高度,将其剪切并调整大小   给定的维度。

// crop the best fitting 1:1 ratio (200x200) and resize to 200x200 pixel
$img->fit(200);

答案 1 :(得分:3)

干预非常适合处理这个问题。这是一个快速的代码段,可以帮助您朝着正确的方向前进:

$resize_to = $this->sizes(); //some arbitrary array

//generate our custom image sizes
foreach ($resize_to as $idx => $width) {
    if ($img = Image::make($file->getRealPath())) {
        $img->resize(width, null, function ($constraint) {
            $constraint->aspectRatio();
            $constraint->upsize();
        });
        $img->encode($encoding_options);
        $img->save($path);
    }
}

在上面我们循环了一些我们想要调整图像大小的宽度数组。请注意我们在下面声明的$constraintsaspectRatio()确保图像永远不会失去它的纵横比。 ->upsize()可防止图像升迁并失去分辨率。

您要求的内容 - 将1400x600图片的大小调整为200x200是不合理的。

相反,您应该只调整一个维度,并确保您的HTML可以解决其余问题。例如,在上面我们只观察widths。所以我们假设在你的$this->sizes()阵列中,其中一个是200.但是图像的比例是不同的,所以它没有产生200x200,它产生了200x150。使用flexbox超级轻松处理HTML中的内容:

<div class="flex-box-centered">
   <img class="flex-img" src="..."/>
</div>

CSS:

.flex-box-centered {
    display:flex;
    width:200px;
    height:200px;
    justify-content:center;
    align-items:center;
    background:#fff;
}

.flex-img {
    display:flex;
    width:100%;
    height:auto;
}

这里是jsfiddle illustrating this concept

答案 2 :(得分:1)

$image中的图片作为Intervention\Image\Image加载后,您可以轻松地执行此操作:

// $height and $width are your max values
if ($image->width < $image->height) {
    $image->resize(null, $height, true, false);
} else {
    $image->resize($width, null, true, false);
}

将以正确的方式调整图像大小。

答案 3 :(得分:1)

好吧,是的,这是更好的选择。由于图像干预在背景中使用Imagick。我建议你使用图像干预。您还可以在保存图像时压缩图像。

// open and resize an image file
$img = Image::make('public/foo.jpg')->resize(300, 200);

// save file as jpg with medium quality
$img->save('public/bar.jpg', 60); 

图像质量范围从0(质量差,文件小)到100(最佳质量,大文件)。

答案 4 :(得分:0)

作曲家需要干预/图像

// config / app.php

return [
    ......
    $provides => [
        ......
        ......,
        'Intervention\Image\ImageServiceProvider'
    ],
    $aliases => [
        .....
        .....,
        'Image' => 'Intervention\Image\Facades\Image'
    ]
]

/ *控制器代码

    /*With Image Compression*/

            $image = $request->file('profile_image');
            $fileExtension   = strtolower($image->getClientOriginalExtension()); 
            $file_name       = sha1(uniqid().$image.uniqid()).'.'.$fileExtension;
            $destinationPath = 'uploads/profile_image/';
                $img = Image::make($image->getRealPath());
                $img->resize(140, 140, function ($constraint) {
                $constraint->aspectRatio();
            })->save($destinationPath.$file_name);

    /*End With Image Compression*/    

答案 5 :(得分:0)

我得到原始图片,然后将大小调整为 50%,这样可以保持更好的比例。所以它对用户来说看起来不错。

$imageDimensions = getimagesize($image);
$width = $imageDimensions[0];
$height = $imageDimensions[1];
$new_width = $imageDimensions[0] * 0.5;
$new_height = ceil($height * ($new_width / $width));
$image = Image::make($image)->resize($new_width, $new_height);

我首先获得正常尺寸,然后进行计算以正确调整其大小。