2015-03-04 8 views
7

Potrzebuję sposobu (używając wbudowanych bibliotek PHP) do ściągnięcia obrazu z adresu URL i zapisania go na dysku lokalnym o zmienionej/skalowanej szerokości WIDTH do 150 pikseli. Próbowałam to:PHP - utwórz miniaturkę z adresu 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"); 
    } 
} 

To wygląda bardzo obiecująco, ale nie mogę dowiedzieć się, jak go używać, a następnie, czy będzie to robić co chcę. Dotyczy/potrzeby:

  1. Co te params myśli: ($updir, $img, $id) - Czy $updir położenie pliku? Lub miejsce, w którym chcę to zapisać? Czy $img jest uchwyt pliku lub nazwa pliku? Lub nowa nazwa pliku? Do czego służy $id? Autor nie dał żadnego przykładu użycia.
  2. Ta funkcja wymaga ode mnie określenia WIDTH i HEIGHT. Chcę tylko określić SZEROKOŚĆ i pozwolić wysokości być proporcjonalna.
  3. muszę ciągnąć obrazy przez 2 różnych typów URL: (1) Podstawowym http://foo ..., oraz (2) składnia dane: data:image/jpeg;base64,/9j/4AAQ....
  4. Idealnie chciałabym przekształcić te obrazy we wszystkich przypadkach w dół do skompresowanej miniatury jpeg (szerokość 150px, dowolna wysokość), nawet jeśli oryginalny obraz nie był w formacie jpg.

Jaki jest najlepszy sposób na osiągnięcie tego?

+0

Cóż, opublikowany skrypt wygląda jak jego baza na przesłanych obrazach na serwer, z którego działa, gdzie '$ updir' będzie ścieżką do katalogu zawierającego je, a' $ id' i '$ img' są częścią nazwy pliku dla jakiegoś rodzaju konwencji nazewnictwa. Tak więc w skrócie działałoby to tylko po pobraniu/skopiowaniu plików. – prodigitalson

+0

spójrz na http://stackoverflow.com/a/27362839/3641016, Pod warunkiem, że mała funkcja pomocnika, aby zmienić rozmiar obrazu w różnych trybach. –

+0

Raphael, przybijałeś to. Chcesz zamieścić swoją odpowiedź, abym mógł dać ci nagrodę? – HerrimanCoder

Odpowiedz

22

Wystarczy to zrobić:

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 
} 

Używaj go tak:

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

Sztuką jest, aby korzystać z wewnętrznego automatyczne wykrywanie plików PHP dla strumienia wejściowego, który jest bardzo dobrze obsługiwane przez ImageCreateFromString

+1

Andy, przyznałem ci to, ponieważ: (1) To działa; (2) nie wysłałeś mnie do bibliotek stron trzecich; (3) jest minimalistyczny; (4) podałeś działający przykład, jak z niego korzystać. Dzięki za doskonałą odpowiedź. – HerrimanCoder

+0

Nie ma za co! :-) – flyandi

+0

Dziękuję @Andy. Twoje rozwiązanie działa idealnie. – Pang

1

Możesz użyć tej klasy SimpleImage. Możesz zmienić rozmiar obrazów bezpośrednio z adresu url i zapisać go w swoim lokalnym serwisie.

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

więcej przykładów można znaleźć here.

1

Co oznaczają te parametry: ($ updir, $ img, $ id) - Czy $ updir jest lokalizacją pliku? Lub miejsce, w którym chcę to zapisać? Czy $ img to uchwyt pliku lub nazwa pliku? Lub nowa nazwa pliku? Do czego służy identyfikator $? Autor nie dał żadnego przykładu użycia.

  • $updir wydaje się być ścieżką do pliku na serwerze
  • $img jest nazwa pliku obrazu (z rozszerzenie)
  • $id wydaje się być pewne numeryczny prefiks (wyłącznie dla twórcy tego funciton wydaje) do nazwy pliku. Zmieniłbym go na $id = '' w nagłówku funkcji.
    .

Ta funkcja wymaga ode mnie określenia WIDTH i HEIGHT. Chcę tylko określić SZEROKOŚĆ i pozwolić wysokości być proporcjonalna.

Cóż, możesz użyć trochę matematyki.Jeśli chcesz obrazów w formacie 4: 3 można zrobić kilka „Współczynnik równania” (nie wiem czy to ma jakieś imię w języku angielskim):

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

Ale jeśli nie wiesz, stosunek i po prostu chcą zachować proporcje , więc myślę, że ta funkcja ci nie pomoże. Możesz wypróbować klasę SimpleImage, jak już wspomniano w innej odpowiedzi (ma ona metodę resizeToWidth())
.

muszę ciągnąć obrazy przez 2 różnych typów URL: (1) Podstawowym http://foo ..., oraz (2) składnia dane: data: image/jpeg; base64,/9j/4AAQ .. ..

Cóż, to zależy od Ciebie. Opublikowaliście tutaj funkcję, a to, co zostanie przekazane jako parametry, jest całkowicie niezależne. Jeśli chodzi o kodowane obrazy, sprawdź this topic, aby dowiedzieć się, jak przekonwertować obraz (możesz zapisać obraz przy użyciu file_put_content() zamiast go wyświetlać).
,

Idealnie chciałabym przekształcić te obrazy we wszystkich przypadkach do skompresowanego miniaturki JPEG (150px szerokość, wysokość) każdy, nawet jeśli oryginalny obraz nie był w formacie jpg.

Ponownie, funkcja, którą opublikowaliście, działa w całości na obrazie wejściowym i nie można go przekonwertować na różne typy. Ponownie, polecam używanie klasy SimpleImage.

0

Oto dobry przykład konwersji adresu URL do obrazu. Wydaje się nieco pracować, ale działa świetnie;) Dla imagemagick, jeśli używasz Windows, musisz skonfigurować imagemagick & show imagemagick dll do php. Click here

0

Próbuję wyjaśnić to w kilku krokach.

1. getImageSize($name) - potrzebuje nazwy obrazu, aby uzyskać obraz. Musisz podać bezwzględny adres URL wraz z dokładną nazwą z rozszerzeniem.

przykład: "abc.com/edit/9/xyz.png"

W powyższym przypadku, jak na swój parametr funkcji.

  1. abc.com/edit/ to domyślny adres URL.
  2. $id to Twój identyfikator konkretnego rekordu
  3. . "_" doda "/" do twojego adresu URL.
  4. to nazwa obrazu konkretnego rekordu.

2, Powyższa funkcja daje tablicę, w której pierwsze dwa parametry to Wysokość i Szerokość obrazu przekazywanego w funkcji. więc musisz przechowywać go w zmiennych. $height i $width.

3, Następnie sprawdzi wysokość i szerokość, a jeśli wysokość lub szerokość nie jest zgodna z wymaganiami, należy je odpowiednio ustawić.

4, Następnie w kodzie, następną pozycją jest dest_x i dest_y, które pomogą wskazać pozycję obrazu.

Dla dwóch różnych adresów URL można zapisać adres URL w stałej zmiennej i umieścić tę stałą w funkcji getImageSize().