Создание картинной галереи - PullRequest
2 голосов
/ 04 декабря 2009

Я хочу создать галерею картинок для своего сайта и загрузить эти картинки из панели администрирования сайта. Я собираюсь показать все изображения на странице с очень маленьким размером, и одно место я буду отделять для каждого изображения, чтобы показать выбранное изображение (из маленьких) с большим размером.

Я знаю два способа сделать это:

  1. Я создаю 2 картинки для загрузки из панели администрирования, одну большую и одну маленькую с фиксированным размером. Таким образом, большой я буду загружать в отдельном большом пространстве. И маленький будет показан в маленьких местах. Поэтому администратор сайта должен СОЗДАТЬ 2 фото.

  2. Второй способ, который я знаю, это использовать библиотеку PHP GD, чтобы иметь возможность загружать только большую картинку, и в каждом месте функция PHP изменяет размер большой картинки и получает 2 размера, которые мне нужны для галерея.

Недостатком первого метода является то, что пользователь сайта должен использовать Photoshop или другой инструмент перед загрузкой. Согласимся, что это не очень приятная вещь для пользователя сайта.

Второй подход тоже не годится, так как GD изменяет размер изображения за счет снижения качества. И эта потеря недопустима, потому что это слишком много.

Как можно изменить размер операции, сохранив качество изображения, близкое к исходному?

Или какой другой подход лучше этих двух?

Ответы [ 8 ]

6 голосов
/ 04 декабря 2009

GD не теряет качество больше, чем Photoshop. Просто убедитесь, что вы используете imagecopyresampled(), а НЕ imagecopyresized(), так как это не делает никакой повторной выборки. Затем сохраните полученное изображение в достаточно высоком качестве; для JPEG это около 80.

Затем сделайте аналогичное изменение размера в Photoshop, и вы увидите, что нет большой разницы. Вы также можете использовать GD для повышения резкости своих миниатюр, что придаст им дополнительную четкость.

EDIT

Я создал инструмент для сравнения различных методов изменения размера, опробуйте его и убедитесь сами, какой метод лучше:

2 голосов
/ 09 декабря 2009

Почему бы не использовать phpThumb () ?

  • Вам нужно только сгенерировать src-ссылки для ваших тегов изображений.
  • Автоматический кеш.
  • Предлагает множество опций для работы с изображениями. См. Страницу demo .
  • Использует ImageMagick и как запасной вариант GD , что вам не нужно заботиться (но вы можете).
  • Почти все может быть настроено. См .: phpThumb.config.php .
2 голосов
/ 07 декабря 2009

Вы можете использовать ImageMagick вместо GD , чтобы получить, вероятно, лучшие результаты. Я не уверен, какой уровень интеграции с вашим сайтом вам нужен, но я предлагаю проверить проект с открытым исходным кодом Gallery , прежде чем начинать кодировать.

2 голосов
/ 07 декабря 2009

Используйте следующую функцию следующим образом:

Image('/path/to/original.image', '1/1', '150*', './thumb.jpg'); // thumb, width = 150 px
Image('/path/to/original.image', null, '600*', './full.jpg'); // full, width = 600 px

Вы можете указать коэффициент обрезки через второй аргумент (w / h), если хотите, вы также можете указать ширину и / или высоту измененного изображения с помощью третьего аргумента (w * h).

function Image($source, $crop = null, $scale = null, $destination = null)
{
    $source = @ImageCreateFromString(@file_get_contents($source));

    if (is_resource($source) === true)
    {
        $size = array(ImageSX($source), ImageSY($source));

        if (isset($crop) === true)
        {
            $crop = array_filter(explode('/', $crop), 'is_numeric');

            if (count($crop) == 2)
            {
                $crop = array($size[0] / $size[1], $crop[0] / $crop[1]);

                if ($crop[0] > $crop[1])
                {
                    $size[0] = $size[1] * $crop[1];
                }

                else if ($crop[0] < $crop[1])
                {
                    $size[1] = $size[0] / $crop[1];
                }

                $crop = array(ImageSX($source) - $size[0], ImageSY($source) - $size[1]);
            }

            else
            {
                $crop = array(0, 0);
            }
        }

        else
        {
            $crop = array(0, 0);
        }

        if (isset($scale) === true)
        {
            $scale = array_filter(explode('*', $scale), 'is_numeric');

            if (count($scale) >= 1)
            {
                if (empty($scale[0]) === true)
                {
                    $scale[0] = $scale[1] * $size[0] / $size[1];
                }

                else if (empty($scale[1]) === true)
                {
                    $scale[1] = $scale[0] * $size[1] / $size[0];
                }
            }

            else
            {
                $scale = array($size[0], $size[1]);
            }
        }

        else
        {
            $scale = array($size[0], $size[1]);
        }

        $result = ImageCreateTrueColor($scale[0], $scale[1]);

        if (is_resource($result) === true)
        {
            ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT);
            ImageSaveAlpha($result, true);
            ImageAlphaBlending($result, true);

            if (ImageCopyResampled($result, $source, 0, 0, $crop[0] / 2, $crop[1] / 2, $scale[0], $scale[1], $size[0], $size[1]) === true)
            {
                ImageConvolution($result, array(array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1)), 8, 0);
                ImageJPEG($result, $destination, 90);
            }
        }
    }

    return false;
}

Изображение автоматически улучшается (обостряется) и сохраняется в формате JPEG с высоким качеством.

Наслаждайтесь!

1 голос
/ 12 декабря 2009

Я использую этот простой сценарий оболочки, которому нужно конвертировать из ImageMagick:

#!/bin/sh

W=256
T="Some recent photos"

cat <<EOF
<HTML>
<HEAD>
<TITLE>$T</TITLE>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-1">
</HEAD>
<BODY STYLE="font-family: sans-serif">
<H1>$T</H1>
Click on the photos to enlarge<P>
EOF

for i
do
convert -resize $W "$i" "T$i"
cat <<EOF
<A HREF="$i"><IMG SRC="T$i" WIDTH=$W></A>
EOF
done

cat <<EOF
</BODY></HTML>
EOF
1 голос
/ 04 декабря 2009

Как насчет использования аргумента качества imagejpeg при выводе изображения?

0 голосов
/ 13 декабря 2009

Если вы не придирчивы к тому, где хранятся изображения, вы можете использовать Flickr PHP API. Поскольку flickr предоставляет изображения разных размеров, вам остается сделать макет для галереи.

Выезд http://phpflickr.com/

Я использовал это для проекта и был удивлен тем, как легко это было. В основном вы можете выполнять каждую операцию через этот API, и вы можете делать это также для нескольких пользователей, так что вы сэкономите много времени себе и другим. И не говоря уже о космосе! -)

0 голосов
/ 09 декабря 2009

Я бы использовал одну загрузку файла, а затем использовал ImageMagick для создания эскиза на сервере (http://www.imagemagick.org/script/index.php)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...