генерация миниатюр / изменение размера изображения

Какую библиотеку PHP вы бы порекомендовали для создания эскизов? Мне нужно, чтобы он работал с GD (не только Imagick), мог растягивать изображения или сохранять соотношение сторон, когда задано только одно измерение, и, что наиболее важно, иметь возможность обрезать и изменять размер изображения (при создании эскизов мне нужно, чтобы все они были , скажем 128x128, поэтому я хочу, чтобы библиотека обрезала изображения в этом случае) Каковы ваши рекомендации?


person migajek    schedule 27.05.2011    source источник
comment
точная копия десяти других вопросов   -  person dynamic    schedule 27.05.2011


Ответы (3)


Я написал собственную GD-оболочку для своего фреймворка, функция. Некоторые примеры:

$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);

Есть и другие хорошие альтернативы, такие как Asido и WideImage, но этот работает для меня, и, поскольку это простой метод только с одной зависимостью, вы можете легко использовать его отдельно:

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;
}

Также поддерживается нанесение водяных знаков и преобразование/отображение (вместо сохранения) изображений.

person Alix Axel    schedule 27.05.2011

вы можете попробовать это: 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);
person Vasil Dakov    schedule 27.05.2011

Просто воспользуйтесь поиском, прежде чем задавать вопросы. О сохранении соотношения сторон и об кадрировании.

person Deele    schedule 27.05.2011
comment
Я не ищу кусок кода, полнофункциональную и протестированную библиотеку. Возможно, с поддержкой «драйверов», чтобы легко переключаться между GD и Imagick. - person migajek; 29.05.2011