2011-09-17 6 views
11

원격으로 호스팅되는 JPG의 크기, 너비 및 높이를 얻으려고합니다. 전체 이미지를 다운로드하여이 작업을 수행하는 것이 가능한지 나는 알았다.이미지를 다운로드하지 않고 전체 크기로 이미지를 결정하는 방법은 무엇입니까?

그러나이 정보를 얻기에 충분할 정도로만 다운로드하면됩니다.

일반적인 이미지는 JPG를 충분히 할 수있는 크기 200K이고 처음에 단지 몇 K 읽기 :

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

, 나는이 답변/의견을 따라하지만 한

누구나 함께 조각을 넣을 수 있습니까 (ImageMagick없이).

+0

당신은 무엇을 시도? JPEG 파일 형식에 대한 이해는 무엇입니까? http : //en.wikipedia에서 함께 만들 수있는 것을보십시오.org/wiki/Exchangeable_image_file_format # 예제 – tripleee

+0

처음 4096 바이트에서 읽으 려했지만 Imagemagick 'identify'또는 'grep -n $ \ xc0'(참조 된 질문/설명 참조)을 실행하기 위해 찾지 못했습니다. – donohoe

답변

3

나는 내 자신의 질문에 대답 할 수 있었고 PHP 코드 스 니펫을 포함 시켰습니다.

유일한 단점은 적어도 부분 크기 이미지를 getImageSize 크기로 읽으려면 부분 이미지 다운로드를 파일 시스템에 쓰는 것입니다.

나를 위해 바이트는 200 ~ 400K 크기의 jpg 이미지를 확인하기위한 안전 한도입니다.

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

우수한 솔루션, 그것은 나를 위해 작동합니다. 덕분에 – ahoo

4

Getting Image size of JPEG from its binary에 따르면 이미지의 크기는 파일의 정확한 위치에 저장되지 않습니다. 확장 기능에 따라 실제 크기 앞에 파일에 전체 데이터를 포함 할 수 있습니다 (예 : 축소판).

다음 C++ 코드는 자신의 PHP 구현을위한 좋은 시작이어야합니다 : http://www.64lines.com/jpeg-width-height. 배열과 같은 데이터를 포함하는 문자열에 액세스하여이 코드를 쉽게 적용 할 수 있습니다.

비교적 큰 데이터 덩어리를로드하고 구문 분석 한 다음 필요하면 더 많이로드해야합니다. 또는 블록 단위로 파일 블록을로드 할 수 있지만 수많은 연결로 인한 오버 헤드는 전체 파일을로드하지 않는 목적을 무효화합니다.

어쨌든, 나는 이점이 당신이 이것에 소비하는 시간을 정당화 할 것인지 확신하지 못합니다. 요즘은 200k가 아닙니다.

+0

확인해 보지만 나에게 너무 어려울 수 있습니다. 200K는 많지는 않지만 사실입니다.하지만 현재의 접근 방법을 모두 사용하여 하루에 500MB + mb로 실행됩니다. – donohoe

2

위의 donohoe의 대답이 개선되었습니다. 이 파일은 here과 같이 png 및 gif 파일의 작은 바이트 범위를 검색합니다.

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

어떻게 같은 ImageMagick과의 ping 기능을 사용하는 방법에 대한 :

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

와우,'-ping'에 대해 전혀 알지 못했습니다! 테스트 결과 약간 더 빨라졌지만 임시 파일을 다운로드하는 단계는 생략되었습니다. – bigjosh

관련 문제