2011-09-17 12 views
11

Czekam na wymiary, szerokość i wysokość zdalnie hostowanego JPG. Widziałem, jak można to zrobić, pobierając pełny obraz.Jak określić rozmiar obrazu bez jego pobierania (w całości)?

Jednak byłoby idealnie, gdybym mógł to zrobić, pobierając tylko tyle, aby uzyskać te informacje.

Typowe zdjęcia są w rozmiarze 200K i czytanie Kilku K potędze na początek może wystarczyć do JPG:

curl_setopt($ch, CURLOPT_RANGE, "0-4096");

Dla porównania, ja po tych odpowiedzi/komentarze ale bezskutecznie (chociaż mogą one być na dobrej drodze):

Czy ktoś był w stanie złożyć kawałki razem (bez lub bez ImageMagick)?

+0

Co próbowałeś? Jakie jest Twoje zrozumienie formatu pliku JPEG? Zobacz, co możesz złożyć razem z http: //en.wikipedia.org/wiki/Exchangeable_image_file_format # Przykład – tripleee

+0

Próbowałem odczytać w pierwszych 4096 bajtach i nie udało mi się znaleźć w celu uruchomienia Imagemagick "identyfikuj" lub "grep -n $ \ xc0" przeciwko niemu (patrz zadane pytania/komentarze). – donohoe

Odpowiedz

3

Udało mi się odpowiedzieć na własne pytanie i dodałem fragment kodu PHP.

Jedyną wadą (przynajmniej dla mnie) jest to, że zapisuje częściowy obraz do pobrania do systemu plików przed odczytaniem w wymiarach z getImageSize.

Dla mnie bajtów to bezpieczny limit do sprawdzania obrazów jpg o rozmiarze od 200 do 400 KB.

function remoteImage($url){ 
    $ch = curl_init ($url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
    curl_setopt($ch, CURLOPT_RANGE, "0-10240"); 

    $fn = "partial.jpg"; 
    $raw = curl_exec($ch); 
    $result = array(); 

    if(file_exists($fn)){ 
     unlink($fn); 
    } 

    if ($raw !== false) { 

     $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

     if ($status == 200 || $status == 206) { 

      $result["w"] = 0; 
      $result["h"] = 0; 

      $fp = fopen($fn, 'x'); 
      fwrite($fp, $raw); 
      fclose($fp); 

      $size = getImageSize($fn); 

      if ($size===false) { 
      // Cannot get file size information 
      } else { 
      // Return width and height 
       list($result["w"], $result["h"]) = $size; 
      } 

     } 
    } 

    curl_close ($ch); 
    return $result; 
} 
+0

Doskonałe rozwiązanie, działa dla mnie. dzięki – ahoo

4

Zgodnie z Getting Image size of JPEG from its binary, rozmiar obrazu nie jest przechowywany w dokładnej lokalizacji w pliku. W zależności od rozszerzenia można mieć cały pakiet danych w pliku przed rzeczywistym rozmiarem, na przykład pocztą kciukową.

Poniższy kod C++ powinien być dobrym początkiem dla własnej implementacji PHP: http://www.64lines.com/jpeg-width-height. Możesz łatwo dostosować ten kod, uzyskując dostęp do łańcucha zawierającego dane, takie jak tablica: myString{$i} zamiast data[i]

Powinieneś załadować stosunkowo dużą porcję danych i przeanalizować ją, a następnie załadować więcej, jeśli to konieczne. Lub możesz załadować blok pliku po bloku, ale narzut związany z licznymi połączeniami uniemożliwia załadowanie całego pliku.

W każdym razie nie jestem pewien, czy korzyści uzasadnią czas poświęcony na to. 200k to nic w dzisiejszych czasach.

+0

Sprawdzę, ale może być za dużo dla mnie. 200K nie jest dużo, prawda - ale potrwa to około 500 + mb dziennie, choć moje obecne podejście do pobierania ich w całości. – donohoe

2

Ulepszona wersja odpowiedzi donohoe powyżej. Ten pobiera mniejsze zakresy bajtów dla plików png i gif zgodnie z opisem here.

function remoteImage($url){ 

    $filename = parse_url($url); 
    $pi = pathinfo($filename['path'],PATHINFO_EXTENSION); 

    switch ($pi) { 
    case "jpg" : 
     $range = "0-15000"; 
     break; 
    case "jpeg" : 
     $range = "0-10000"; 
     break; 
    case "png": 
     $range = "0-100"; 
     break; 
    case "gif": 
     $range = "0-10"; 
     break; 
    default: 
     $range = "0-15000"; 
     break; 
    } 

    $ch = curl_init ($url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
    curl_setopt($ch, CURLOPT_RANGE, $range); 

    $fn = "partial2.png"; 
    $raw = curl_exec($ch); 
    $result = array(); 

    if(file_exists($fn)){ 
     unlink($fn); 
    } 

    if ($raw !== false) { 

     $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

     if ($status == 200 || $status == 206) { 

      $result["w"] = 0; 
      $result["h"] = 0; 

      $fp = fopen($fn, 'x'); 
      fwrite($fp, $raw); 
      fclose($fp); 

      $size = getImageSize($fn); 

      if ($size===false) { 
       // Cannot get file size information 
      } else { 
       // Return width and height 
       list($result["w"], $result["h"]) = $size; 

      } 

     } 
    } 

    curl_close ($ch); 
    return $result; 
} 
6

Jak na temat korzystania ping funkcjonalność ImageMagick jest tak:

identify -ping -format "%wx%h" http://www.google.com/logos/giroux1.jpg 
482x142 
+0

Wow, nigdy nie wiedziałem o '-ping'! Testy pokazują, że jest tylko nieco szybszy, ale zapisuje krok pobierania pliku tymczasowego. – bigjosh

Powiązane problemy