2015-03-04 3 views
7

Мне нужен способ (используя встроенные библиотеки PHP), чтобы вытащить изображение из URL и сохранить его на локальный диск с измененным/масштабированным WIDTH до 150 пикселей. Я пытался это:PHP - создать эскиз с url

Creating a thumbnail from an uploaded image

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

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

+0

Ну, сценарий, который вы разместили, похож на его базы при загрузке изображений на сервер, где он запускается там, где '$ updir' будет путь к каталогу, содержащему их, и' $ id' и '$ img' являются частью имени файла для какого-то соглашения об именах. Короче говоря, это будет работать только после того, как вы загрузите/скопируете файлы. – prodigitalson

+0

взгляните на http://stackoverflow.com/a/27362839/3641016, я предоставил небольшую вспомогательную функцию для изменения размера изображения в разных режимах. –

+0

Рафаэль, ты прибил его. Хотите отправить свой ответ, чтобы я мог дать вам щедрость? – HerrimanCoder

ответ

22

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

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

+1

Энди, я наградил вас за то, что: (1) Он работает; (2) вы не отправили меня в сторонние библиотеки; (3) минимализм; (4) вы дали рабочий пример того, как его использовать. Спасибо за прекрасный ответ. – HerrimanCoder

+0

Добро пожаловать! :-) – flyandi

+0

Спасибо @ Энди. Ваше решение работает отлично. – Pang

1

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

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

еще пример можно найти here.

1

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

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

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

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

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

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

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

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

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

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

0

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

0

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

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

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

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

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

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

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

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

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

Смежные вопросы