【问题标题】:thumbnail generation / image resize缩略图生成/图像调整大小
【发布时间】:2011-09-03 10:46:44
【问题描述】:

你会推荐什么 PHP 库来生成缩略图? 我需要它与 GD(不仅是 Imagick)一起工作,能够在仅给定一个维度时拉伸图像或保持纵横比,并且 - 最重要的是 - 能够裁剪和调整图像大小(在生成缩略图时,我需要所有这些都是,假设是 128x128,所以我希望库在这种情况下裁剪图像) 你有什么建议?

【问题讨论】:

  • 其他十个问题的完全相同

标签: php image gd thumbnails imagick


【解决方案1】:

你可以试试这个:https://gist.github.com/342704/

示例用法:

include("classes/Resize.php");
$resizer = new Resize('images/cars/large/input.jpg');
$resizer->resizeImage(150, 100, 0);
$resizer->saveImage('images/cars/large/output.jpg', 100);

【讨论】:

    【解决方案2】:

    我为我的框架 phunction 编写了自己的 GD wrapper。一些例子:

    $input = '/path/to/source/image.jpg';
    $output = '/path/to/destination/image.jpg';
    
    /*
    this will crop the biggest possible square (since 128/128 = 1)
    from the center of the image and resize the width to 500px
    while keeping the height porportional (to maintian aspect ratio)
    */
    ph()->Disk->Image($input, '128/128', '500*0', null, $output);
    
    /*
    same as the above, but aspect ratio is not respected
    since both width and height are specified
    */
    ph()->Disk->Image($input, '128/128', '500*1000', null, $output);
    
    /*
    no cropping, just porpotional resize to the width
    */
    ph()->Disk->Image($input, null, '500*0', null, $output);
    

    还有其他不错的选择,例如 AsidoWideImage,但这个对我有用,因为它是一种只有一个依赖项的简单方法,您可以轻松地独立使用它:

    function Image($input, $crop = null, $scale = null, $merge = null, $output = null, $sharp = true)
    {
        if (isset($input, $output) === true)
        {
            if (is_string($input) === true)
            {
                $input = @ImageCreateFromString(@file_get_contents($input));
            }
    
            if (is_resource($input) === true)
            {
                $size = array(ImageSX($input), ImageSY($input));
                $crop = array_values(array_filter(explode('/', $crop), 'is_numeric'));
                $scale = array_values(array_filter(explode('*', $scale), 'is_numeric'));
    
                if (count($crop) == 2)
                {
                    $crop = array($size[0] / $size[1], $crop[0] / $crop[1]);
    
                    if ($crop[0] > $crop[1])
                    {
                        $size[0] = round($size[1] * $crop[1]);
                    }
    
                    else if ($crop[0] < $crop[1])
                    {
                        $size[1] = round($size[0] / $crop[1]);
                    }
    
                    $crop = array(ImageSX($input) - $size[0], ImageSY($input) - $size[1]);
                }
    
                else
                {
                    $crop = array(0, 0);
                }
    
                if (count($scale) >= 1)
                {
                    if (empty($scale[0]) === true)
                    {
                        $scale[0] = round($scale[1] * $size[0] / $size[1]);
                    }
    
                    else if (empty($scale[1]) === true)
                    {
                        $scale[1] = round($scale[0] * $size[1] / $size[0]);
                    }
                }
    
                else
                {
                    $scale = array($size[0], $size[1]);
                }
    
                $image = ImageCreateTrueColor($scale[0], $scale[1]);
    
                if (is_resource($image) === true)
                {
                    ImageFill($image, 0, 0, IMG_COLOR_TRANSPARENT);
                    ImageSaveAlpha($image, true);
                    ImageAlphaBlending($image, true);
    
                    if (ImageCopyResampled($image, $input, 0, 0, round($crop[0] / 2), round($crop[1] / 2), $scale[0], $scale[1], $size[0], $size[1]) === true)
                    {
                        $result = false;
    
                        if ((empty($sharp) !== true) && (is_array($matrix = array_fill(0, 9, -1)) === true))
                        {
                            array_splice($matrix, 4, 1, (is_int($sharp) === true) ? $sharp : 16);
    
                            if (function_exists('ImageConvolution') === true)
                            {
                                ImageConvolution($image, array_chunk($matrix, 3), array_sum($matrix), 0);
                            }
                        }
    
                        if ((isset($merge) === true) && (is_resource($merge = @ImageCreateFromString(@file_get_contents($merge))) === true))
                        {
                            ImageCopy($image, $merge, round(0.95 * $scale[0] - ImageSX($merge)), round(0.95 * $scale[1] - ImageSY($merge)), 0, 0, ImageSX($merge), ImageSY($merge));
                        }
    
                        foreach (array('gif' => 0, 'png' => 9, 'jpe?g' => 90) as $key => $value)
                        {
                            if (preg_match('~' . $key . '$~i', $output) > 0)
                            {
                                $type = str_replace('?', '', $key);
                                $output = preg_replace('~^[.]?' . $key . '$~i', '', $output);
    
                                if (empty($output) === true)
                                {
                                    header('Content-Type: image/' . $type);
                                }
    
                                $result = call_user_func_array('Image' . $type, array($image, $output, $value));
                            }
                        }
    
                        return $result;
                    }
                }
            }
        }
    
        else if (count($result = @GetImageSize($input)) >= 2)
        {
            return array_map('intval', array_slice($result, 0, 2));
        }
    
        return false;
    }
    

    还支持水印和转换/显示(而不是保存)图像。

    【讨论】:

      【解决方案3】:

      在提问之前使用搜索。关于keeping aspect ratioabout cropping

      【讨论】:

      • 我不是在寻找一段代码,一个功能齐全且经过测试的库。可能通过“驱动程序”支持在 GD 和 Imagick 之间轻松切换。
      猜你喜欢
      • 2012-03-16
      • 2012-01-06
      • 2013-06-22
      • 2013-06-24
      • 1970-01-01
      • 2015-07-16
      • 2011-06-03
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多