Получить размеры изображения с помощью Curl - PullRequest
1 голос
/ 15 мая 2009

Я хотел бы высоту * ширину удаленного изображения. Можно ли это сделать с помощью Curl, и если да, то как?

Ответы [ 5 ]

5 голосов
/ 15 мая 2009

getimagesize () - это функция, которую вы хотите.

Он должен иметь возможность загрузить удаленное изображение и проанализировать его.

Редактировать: В качестве более прямого ответа на ваш вопрос, Curl не может анализировать изображение напрямую, но он, безусловно, может получить его для вас, и в этом случае вы можете использовать библиотеку GD для анализа. Однако getimagesize () также выполняет выборку, поэтому вы можете оставить Curl вне уравнения.

3 голосов
/ 08 апреля 2010

Надеюсь, этот отдельный пост оправдан, так как я был обеспокоен тем, что этот ответ будет потерян как просто комментарий к моему предыдущему посту. И почему вы считаете это достойным отдельного поста, спросите вы? Ну, я думаю, что нашел ответ.

Конечно, я использую CLI-версию, а не libcurl (на вашем языке по вашему выбору), но я достаточно возился, пока не получил рабочий ответ. Это выглядит следующим образом:

curl -r 0-25 --silent http://www.google.com/logos/giroux1.jpg | identify -format "%wx%h" -

То, что происходит здесь в приведенном выше примере, заключается в том, что CURL использует флаг -r для запроса только первых 25 байтов файла и передает его команде imagemagick с именем IDENTIFY, где он извлекает размеры и распечатывает их в указанном формат.

Для получения дополнительной информации о том, что вы можете извлечь с помощью ИДЕНТИФИКАЦИИ, посетите http://www.imagemagick.org/script/identify.php

Чтобы сделать команду немного более понятной для сценариев, я бы добавил в конец "2> / dev / null", чтобы подавить сообщения об ошибках (stderr):

curl -r 0-25 --silent http://www.google.com/logos/giroux1.jpg | identify -quiet -format "%wx%h" - 2> /dev/null

В отличие от изображений в формате GIF, где размеры, по-видимому, тесно связаны с первыми 10-20 байтами, похоже, что для получения данных размеров из JPEG не требуется фиксированное количество байтов. Еще одно тестирование показало, что для больших изображений вам может потребоваться запросить первые ~ 10k, чтобы получить данные измерений. Хорошим примером является следующее изображение размером 4 МБ из НАСА: http://veimages.gsfc.nasa.gov/17921/southern_africa_25jul02_lrg.jpg Я обнаружил, что не менее 5971 байта будет отображать размеры (10836 x 9324), но я полагаю, это лучше, чем загружать все это.

Дело в том, что ... ваш пробег может отличаться, так что попробуйте сами.

1 голос
/ 07 апреля 2010

В соответствии с документами CURL:

С HTTP 1.1 байтовые диапазоны были представил. Используя это, клиент может запросить только один или несколько части указанного документа. Curl поддерживает это с флагом -r.

Get the first 100 bytes of a document:  
    curl -r 0-99 http://www.get.this/

Get the last 500 bytes of a document:  
    curl -r -500 http://www.get.this/

Учитывая, что вы можете запросить только части изображения через CURL, вы могли бы очень хорошо выполнить то, что вы хотите сделать. Теперь ключ может передавать частичное изображение в нечто вроде GD (или по вашему выбору), чтобы извлечь и сообщить размеры изображения.

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

Хотя для этого требуется дополнительная работа, может показаться, что нечто подобное приведет вас к правильному маркеру:

curl -r 0-999 --url http://www.google.com/logos/giroux1.jpg | grep -n $'\xc0'

Некоторые другие справочные источники, с которыми я столкнулся при поиске информации JPEG:

1 голос
/ 15 мая 2009

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

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

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

1 голос
/ 15 мая 2009

Керл не может этого сделать. Цитата из http://curl.haxx.se/

Blockquote curl - это инструмент командной строки для передачи файлов с синтаксисом URL, поддерживающий FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS и FILE. curl поддерживает сертификаты SSL, HTTP POST, HTTP PUT, загрузку по FTP, загрузку на основе форм HTTP, прокси-серверы, куки-файлы, аутентификацию пользователя и пароля (Basic, Digest, NTLM, Negotiate, kerberos ...), возобновление передачи файлов, туннелирование прокси и Busload других полезных трюков.

С помощью Curl можно посмотреть заголовки http и угадать тип изображения, но для определения размера изображения вам понадобится само изображение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...