PHP - создание уменьшенного изображения из URL


Мне нужен способ (с использованием встроенных библиотек PHP) удалить изображение с URL-адреса и сохранить его на локальном диске с измененной/масштабированной ШИРИНОЙ до 150 пикселей. Я пытался это сделать:

Создание эскиза из загруженного изображения

function makeThumbnails($updir, $img, $id)
{
    $thumbnail_width = 134;
    $thumbnail_height = 189;
    $thumb_beforeword = "thumb";
    $arr_image_details = getimagesize("$updir" . $id . '_' . "$img"); // pass id to thumb name
    $original_width = $arr_image_details[0];
    $original_height = $arr_image_details[1];
    if ($original_width > $original_height) {
        $new_width = $thumbnail_width;
        $new_height = intval($original_height * $new_width / $original_width);
    } else {
        $new_height = $thumbnail_height;
        $new_width = intval($original_width * $new_height / $original_height);
    }
    $dest_x = intval(($thumbnail_width - $new_width) / 2);
    $dest_y = intval(($thumbnail_height - $new_height) / 2);
    if ($arr_image_details[2] == 1) {
        $imgt = "ImageGIF";
        $imgcreatefrom = "ImageCreateFromGIF";
    }
    if ($arr_image_details[2] == 2) {
        $imgt = "ImageJPEG";
        $imgcreatefrom = "ImageCreateFromJPEG";
    }
    if ($arr_image_details[2] == 3) {
        $imgt = "ImagePNG";
        $imgcreatefrom = "ImageCreateFromPNG";
    }
    if ($imgt) {
        $old_image = $imgcreatefrom("$updir" . $id . '_' . "$img");
        $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
        imagecopyresized($new_image, $old_image, $dest_x, $dest_y, 0, 0, $new_width, $new_height, $original_width, $original_height);
        $imgt($new_image, "$updir" . $id . '_' . "$thumb_beforeword" . "$img");
    }
}

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

  1. Что означают эти параметры: ($updir, $img, $id) -- Является ли $updir местоположением файла? Или место, где я этого хочу спасен? Является ли $img дескриптором файла или именем файла? Или новое имя файла? Для чего нужен $id? Автор не привел никаких примеров использования.
  2. Функция, похоже, требует, чтобы я указал ШИРИНУ и ВЫСОТУ. Я только хочу указать ШИРИНУ и позволить высоте быть пропорциональной.
  3. Мне нужно перетащить изображения по 2 различным типам URL: (1) Основной http://foo ..., и (2) синтаксис данных: data:image/jpeg;base64,/9j/4AAQ....
  4. В идеале я хотел бы преобразовать эти изображения во всех случаях в сжатый эскиз в формате jpeg (ширина 150 пикселей, любая высота), даже если исходное изображение не было в формате jpg.

Каков наилучший способ добиться этого?

Author: Community, 2015-03-04

5 answers

Просто сделай это:

function Thumbnail($url, $filename, $width = 150, $height = true) {

 // download and create gd image
 $image = ImageCreateFromString(file_get_contents($url));

 // calculate resized ratio
 // Note: if $height is set to TRUE then we automatically calculate the height based on the ratio
 $height = $height === true ? (ImageSY($image) * $width / ImageSX($image)) : $height;

 // create image 
 $output = ImageCreateTrueColor($width, $height);
 ImageCopyResampled($output, $image, 0, 0, 0, 0, $width, $height, ImageSX($image), ImageSY($image));

 // save image
 ImageJPEG($output, $filename, 95); 

 // return resized image
 return $output; // if you need to use it
}

Используйте его так:

Thumbnail("http://cdn.cutestpaw.com/wp-content/uploads/2013/01/l-Cute-Kitten.jpg", "kitten.jpg");

Хитрость здесь в том, чтобы использовать внутреннее автоматическое обнаружение файлов PHP для входящего потока, которое очень хорошо обрабатывается ImageCreateFromString

 26
Author: flyandi, 2015-03-13 04:46:14

Вы можете использовать этот класс simpleimage. Вы можете изменять размер изображений прямо с URL-адреса и сохранять их в своем локальном файле, как это.

$image = new SimpleImage(); 
$image->load('http://website.com/yourimage.jpg'); 
$image->resize(250,400);
$image->save('filename.jpg');

Еще один пример можно найти здесь.

 1
Author: Sachin Joshi, 2015-03-11 06:26:48

Что означают эти параметры: ($updir, $img, $id) - Является ли $updir местоположением файла? Или место, где я хочу его сохранить? Является ли $img дескриптором файла или именем файла? Или новое имя файла? Для чего нужен $id? Автор не привел никаких примеров использования.

  • $updir похоже, это путь к файлу на сервере
  • $img - имя файла изображения ( с расширением )
  • $id похоже, это какой-то числовой префикс (исключительно для создателя этого функция, кажется) к имени файла. Я бы изменил его на $id = '' в заголовке функции.
    .

Функция, похоже, требует, чтобы я указал ШИРИНУ и ВЫСОТУ. Я только хочу указать ШИРИНУ и позволить высоте быть пропорциональной.

Ну, вы можете использовать некоторую математику. Если вам нужны изображения в соотношении 4:3, вы можете сделать некоторое "уравнение соотношения" (понятия не имею, есть ли у него какое-либо название на английском языке):

$thumbnail_width = 1234;
$thumbnail_height = $thumbnail_width * 3 / 4;

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

Мне нужно перетащить изображения по 2 различным типам URL: (1) Основной http://foo ..., и (2) синтаксис данных: данные: изображение/jpeg; base64,/9j/4AAQ....

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

В идеале я хотел бы преобразовать эти изображения во всех случаях в сжатый эскиз jpeg (ширина 150 пикселей, любая высота), даже если исходное изображение не было в формате jpg.

Опять же, функция, которую вы опубликовали, полностью работает на входном изображении, и как есть, она не может преобразовываться в разные типы. Опять же, я бы рекомендовал использовать SimpleImage класс.

 1
Author: Forien, 2017-05-23 11:46:13

Вот хороший пример преобразования URL-адреса в изображение. Кажется, что это немного работает, но это отлично работает;) Для imagemagick, если вы используете Windows, вам необходимо настроить imagemagick и показать библиотеку dll imagemagick на php. Нажмите здесь

 0
Author: Emre Karataşoğlu, 2015-03-11 13:01:55

Я пытаюсь объяснить это в несколько шагов.

1.getImageSize($name)- для получения изображения требуется имя изображения. Итак, вам нужно указать абсолютный URL-адрес вместе с точным именем изображения с расширением.

Например: "abc.com/edit/9/xyz.png"

В приведенном выше случае, в соответствии с вашим параметром функции.

  1. abc.com/edit/ - ваш URL-адрес по умолчанию.
  2. $id - это ваш идентификатор вашего
  3. особая запись. '_' добавит '/' в ваш URL-адрес.
  4. $img - имя изображения конкретного запись.

2, Приведенная выше функция выдаст вам массив, в котором первыми двумя параметрами являются высота и ширина изображения, переданного в функции. поэтому вам нужно хранить его в переменных. $height и $width.

3, Затем он проверит высоту и ширину, и если высота или ширина не соответствуют требованиям, то вам нужно установить их соответствующим образом.

4, Затем в коде далее идут dest_x и dest_y, которые помогут вам указать положение вашего изображения.

И Для двух разных URL-адресов вы можете сохранить эти URL-адреса в постоянной переменной и поместить эту постоянную переменную в свою функцию getImageSize().

 0
Author: Viraj_T, 2015-04-13 04:56:08