Как изменить размер изображения во время отображения?

Можно ли изменить размер изображения при отображении изображения на веб-сайте? / Как изменить размер изображения после загрузки изображения?

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

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


person iLaYa ツ    schedule 13.07.2012    source источник
comment
или мне нужно создать изображение для всех размеров, которые мне нужны при загрузке? -- почему бы нет?   -  person zerkms    schedule 13.07.2012
comment
да, предпочитайте изменять размер/обрезать столько, сколько вы можете использовать в первую очередь, так как это будет большой нагрузкой для apache.   -  person Cauliturtle    schedule 13.07.2012
comment
Да, сделайте изменение размера на этапе загрузки.   -  person Adi    schedule 13.07.2012
comment
Мне нужно всего 8 разных размеров изображений, поэтому мне нужно создать 8 папок и изменить размер для каждого размера при добавлении? Я думаю, мы можем изменить размер изображения во время отображения...   -  person iLaYa ツ    schedule 13.07.2012


Ответы (3)


Конечно, это возможно. Кроме того, это, пожалуй, лучший подход: создавать необходимые миниатюры по запросу. Если ваш сайт находится в стадии разработки, вы никогда не угадаете, какие размеры создаст конструктор завтра. И вы будете возвращаться к своей функции загрузки снова и снова, чтобы подогнать ее под новый дизайн. Стоит убрать жесткую зависимость между дизайном и логикой.

Я не уверен насчет codeignitor. В любом случае, используйте что-то вроде этого в своих шаблонах:

class Image {

    public $filename;
    public $caption;

    /**
     * Return full path to image.
     * @return string path to file to make thumb
     */
    public function fullPath() {
        return "data/files/{$this->filename}";
    }

    /**
     * Renders HTML IMG for thumb of given size.
     * 
     * @param int $width max width, set to -1, if not important
     * @param type $height max height, set to -1, if not important
     * @return string html tag for image with correct width and height attributes
     */
    public function htmlTag($width, $height) {
        $t = $this->getThumb($width, $height);
        return "<img src=\"{$t}\" alt=\"{$this->caption}\" width=\"{$width}\" height=\"{$height}\" />";
    }

    /**
     * Get/create thumb image
     * @param int $width width of the image
     * @param int $height height of the image
     * @return string path to the image
     */
    public function getThumb(&$width, &$height) {
        $currentImage = $this->fullPath();

        $thumbFilename = md5($this->path . $width . $height) . '.png';

        $thumbDir = 'data/thumbs/';
        $thumbFilename = "{$thumbDir}/{$thumbFilename}";

        // thumb already done?
        if (is_file($thumbFilename)) {
            // get real size to create correct html img tag
            if ($width<0 || $height<0) {
                $size = getimagesize($thumbFilename);
                $width = $size[0];
                $height = $size[1];
            }
            return $thumbFilename;
        }

        $ext = strtolower(pathinfo($currentImage, PATHINFO_EXTENSION));
        if ($ext == 'jpeg' || $ext == 'jpg') {
            $source = imagecreatefromjpeg($currentImage);
        } else if ($ext == 'gif') {
            $source = imagecreatefromgif($currentImage);
        } else if ($ext == 'png') {
            $source = imagecreatefrompng($currentImage);
        }

        $currentWidth = imagesx($source);
        $currentHeight = imagesy($source);

        // the sizes which we really will apply (default setup)
        $realWidth = $width;
        $realHeight = $height;
        $realX = 0;
        $realY = 0;

        // decide regarding cutting
        // if all params > 0, cuttin will be done
        $cut = FALSE;
        if ($width > 0 && $height > 0) {
            $cut = TRUE;
        } else if ($width < 0) { // width is not important, set proportion to that
            $width = $realWidth = round($currentWidth * $height / $currentHeight);
        } else if ($height < 0) { // height is not imporant
            $height = $realHeight = round($currentHeight * $width / $currentWidth);
        }

        if ($cut) {
            $kw = $currentWidth / $width;
            $kh = $currentHeight / $height;

            $k = $kw < $kh ? $kw : $kh;

            $realWidth = round($currentWidth / $k);
            $realHeight = round($currentHeight / $k);

            if ($kh < $kw) {
                $realX = round(($realWidth - $width) / 2) * $k;
            } else {
                $realY = round(($realHeight - $height) / 2) * $k;
            }
        }

        $virtual = imagecreatetruecolor($width, $height);
        imagealphablending($virtual, false);
        $col = imagecolorallocatealpha($virtual, 0, 0, 0, 127);
        imagefill($virtual, 0, 0, $col);
        imagesavealpha($virtual, true);

        imagecopyresampled($virtual, $source, 0, 0, $realX, $realY, $realWidth, $realHeight, $currentWidth, $currentHeight);

        // create file
        imagepng($virtual, $thumbFilename);

        return $thumbFilename;
    }
}

Применение:

$image = new Image();
$image->filename = "image.jpeg"; // really stored in 'data/files/image.jpg', let's say 300x400px
$image->caption = "My Image";

// get thumb 50x50: left and right parts of image will be cut off
echo $image->htmlTag(50, 50);

// get thumb of width 100 (height does not matter, keep proportions)
echo $image->htmlTag(100, -1);

// get thumb of height 100 (width does not matter, keep proportions)
echo $image->htmlTag(-1, 100);
person iutinvg    schedule 13.07.2012

Ответы Аруна Джейна решают технические/практические аспекты вашего вопроса удобным способом.

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

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

Библиотека timthumb, похоже, отлично справляется со всеми этими задачами, хотя сам я ее не использовал.

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

person yadutaf    schedule 13.07.2012

Можно изменить размер изображения без сжатия, если вы получите соотношение высоты и ширины и динамически в новой высоте и ширине в том же соотношении. Но когда вам нужно маленькое изображение, если вы загружаете большое изображение и используете высоту и ширину для отображения в маленьком размере. Это ненужное время загрузки для пользователя.

person Nish    schedule 13.07.2012
comment
Итак, какое-либо альтернативное решение для этого? - person iLaYa ツ; 13.07.2012
comment
Альтернативой является только создание эскиза разных размеров. В противном случае вы должны признать проблему с производительностью загрузки сайта. - person Nish; 13.07.2012