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");
}
}
Это выглядит очень многообещающе, но я не могу понять, как его использовать, и будет ли он делать то, что я хочу. Проблемы/потребности:
- Что означают эти параметры:
($updir, $img, $id)
-- Является ли$updir
местоположением файла? Или место, где я этого хочу спасен? Является ли$img
дескриптором файла или именем файла? Или новое имя файла? Для чего нужен$id
? Автор не привел никаких примеров использования. - Функция, похоже, требует, чтобы я указал ШИРИНУ и ВЫСОТУ. Я только хочу указать ШИРИНУ и позволить высоте быть пропорциональной.
- Мне нужно перетащить изображения по 2 различным типам URL: (1) Основной http://foo ..., и (2) синтаксис данных:
data:image/jpeg;base64,/9j/4AAQ....
- В идеале я хотел бы преобразовать эти изображения во всех случаях в сжатый эскиз в формате jpeg (ширина 150 пикселей, любая высота), даже если исходное изображение не было в формате jpg.
Каков наилучший способ добиться этого?
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
Вы можете использовать этот класс simpleimage. Вы можете изменять размер изображений прямо с URL-адреса и сохранять их в своем локальном файле, как это.
$image = new SimpleImage();
$image->load('http://website.com/yourimage.jpg');
$image->resize(250,400);
$image->save('filename.jpg');
Еще один пример можно найти здесь.
Что означают эти параметры: ($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
класс.
Вот хороший пример преобразования URL-адреса в изображение. Кажется, что это немного работает, но это отлично работает;) Для imagemagick, если вы используете Windows, вам необходимо настроить imagemagick и показать библиотеку dll imagemagick на php. Нажмите здесь
Я пытаюсь объяснить это в несколько шагов.
1.getImageSize($name)
- для получения изображения требуется имя изображения. Итак, вам нужно указать абсолютный URL-адрес вместе с точным именем изображения с расширением.
Например: "abc.com/edit/9/xyz.png"
В приведенном выше случае, в соответствии с вашим параметром функции.
-
abc.com/edit/
- ваш URL-адрес по умолчанию. -
$id
- это ваш идентификатор вашего - особая запись. '_' добавит '/' в ваш URL-адрес.
-
$img
- имя изображения конкретного запись.
2, Приведенная выше функция выдаст вам массив, в котором первыми двумя параметрами являются высота и ширина изображения, переданного в функции. поэтому вам нужно хранить его в переменных. $height
и $width
.
3, Затем он проверит высоту и ширину, и если высота или ширина не соответствуют требованиям, то вам нужно установить их соответствующим образом.
4, Затем в коде далее идут dest_x и dest_y, которые помогут вам указать положение вашего изображения.
И Для двух разных URL-адресов вы можете сохранить эти URL-адреса в постоянной переменной и поместить эту постоянную переменную в свою функцию getImageSize()
.