Как определить размер изображения без его загрузки (в полном объеме)?

Я ищу, чтобы получить размеры, ширину и высоту, удаленно размещенный JPG. Я видел, как это можно сделать, загрузив полное изображение.

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

Типичные изображения имеют размер 200 КБ, и чтение всего в несколько раз может быть достаточно для JPG:

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

Для справки, я следил за этими ответами / комментариями, но безрезультатно (хотя они могут быть на правильном пути):

  • Получить размеры изображения с помощью Curl
  • Альтернатива CURLOPT_RANGE для захвата определенного раздела

Кто-нибудь мог собрать все вместе (без или без ImageMagick)?

Как насчет использования функций ping ImageMagick следующим образом:

 identify -ping -format "%wx%h" http://img.ruphp.com/php/giroux1.jpg 482x142 

Согласно размеру получения изображения JPEG из его двоичного файла , размер изображения не сохраняется в точном месте в файле. В зависимости от расширения вы можете иметь целую кучу данных в файле до фактического размера, например, в виде большого пальца.

Следующий код на C ++ должен стать хорошим началом для вашей собственной реализации PHP: http://www.64lines.com/jpeg-width-height . Вы можете легко адаптировать этот код, myString{$i} к строке, содержащей ваши данные, как массив: myString{$i} вместо data[i]

Вы должны загрузить относительно большой фрагмент данных и проанализировать его, а затем загрузить больше, если необходимо. Или вы можете загружать блок блоков за кадром, но накладные расходы, вызванные многочисленными соединениями, не позволяют цели не загружать весь файл.

Во всяком случае, я не уверен, что преимущества будут оправдывать время, потраченное на это. 200k сейчас ничего.

Мне удалось ответить на мой собственный вопрос, и я включил фрагмент кода PHP.

Единственный недостаток (по крайней мере для меня) заключается в том, что он записывает загрузку частичного изображения в файловую систему до чтения в измерениях с помощью getImageSize .

Для меня 10240 байт – это безопасный предел для проверки изображений jpg размером от 200 до 400 КБ.

 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; } 

Улучшенная версия ответа донохо выше. Он извлекает меньшие байтовые диапазоны для 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; }