Мне нужна высота * ширины удаленного изображения. Это можно сделать с помощью Curl, и если да, то как?
Высота и ширина изображения – это атрибуты внутри файла изображения, и вам нужно вернуть файл, чтобы иметь доступ к ним. В зависимости от формата изображения эти атрибуты будут находиться в разных местах метаданных изображения. Вы можете сделать это с помощью getimagesize, но имейте в виду, что вы фактически извлекаете полное изображение, что повлияет на производительность вашей операции.
В случае большого изображения вы можете попробовать что-то вроде начала fecthing изображения на ваш сервер и, как только вы начнете получать данные и знаете формат изображения, дождитесь, пока вы получите достаточно изображения, чтобы посмотреть на высоту и информацию о ширине и остановить передачу. Скорее всего, вам нужно будет выполнить эту работу самостоятельно, так как библиотеки изображений и встроенные функции в API, вероятно, ожидают, что полное изображение будет работать правильно.
Если случайно вы управляете сервером, на котором находятся изображения, вам лучше написать небольшой скрипт, размещенный на этом сервере, который дал идентификатор файла изображения, который возвращает высоту и ширину для этого изображения.
Функция getimagesize () – это функция, которую вы хотите.
Он должен иметь возможность загружать удаленное изображение и анализировать его.
Изменить: как более прямой ответ на ваш вопрос, Curl не может анализировать изображение напрямую, но он, безусловно, может получить его для вас, и в этом случае вы можете использовать библиотеку GD для ее анализа. getimagesize () также удается выполнить выборку, поэтому вы можете оставить Curl из уравнения.
Надеюсь, этот отдельный пост оправдан, поскольку я был обеспокоен тем, что этот ответ будет потерян как просто комментарий к моему предыдущему сообщению. И почему вы думаете, что это заслуживает отдельного поста, спросите вы? Ну, я думаю, что нашел ответ.
Конечно, я использую версию CLI, а не libcurl (на вашем собственном языке), но я достаточно много путешествовал, пока не получил рабочий ответ. Это выглядит так:
curl -r 0-25 --silent http://img.ruphp.com/php/giroux1.jpg | identify -format "%wx%h" -
Что здесь происходит в приведенном выше примере, CURL использует флаг -r, чтобы запросить только первые 25 байтов файла и трубопровода для команды imagemagick с именем IDENTIFY, где он извлекает размеры и выводит их в указанном формате.
Для получения дополнительной информации о том, что вы можете извлечь с помощью IDENTIFY, посетите http://www.imagemagick.org/script/identify.php
Чтобы сделать команду немного более дружественной к скрипту, я бы добавил «2> / dev / null» в конец для подавления сообщений об ошибках (stderr):
curl -r 0-25 --silent http://img.ruphp.com/php/giroux1.jpg | identify -quiet -format "%wx%h" - 2> /dev/null
В отличие от изображений GIF, где размеры кажутся жестко привязаны к первым 10-20 байтам, не существует фиксированного количества байтов, необходимых для получения данных измерений из JPEG. Еще одно тестирование показало, что для больших изображений вам может потребоваться до первого ~ 10k получить данные измерений. Хорошим примером является следующее изображение из 4 МБ из NASA: http://img.ruphp.com/php/southern_africa_25jul02_lrg.jpg Я обнаружил, что размеры не менее 5971 байт будут отображаться (10836 x 9324), но я предполагаю, что это лучше, чем загрузить все это.
Точка … ваш пробег может варьироваться, поэтому попробуйте сами.
Curl не может этого сделать. Цитата из 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-форм, прокси-серверы, файлы cookie, аутентификацию пользователя и пароля (Basic, Digest, NTLM, Negotiate, kerberos …), возобновление передачи файлов, прокси-туннелирование и загрузка других полезных трюков.
Curl может использоваться для просмотра заголовков http и угадывания типа изображения, но для определения размера изображения вам понадобится сам образ.
Вы можете использовать, например. Python Imaging Library для фактической проверки размера при загрузке изображения.
В документах 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://img.ruphp.com/php/giroux1.jpg | grep -n $'\xc0'
Некоторые другие справочные источники, с которыми я сталкивался при поиске в формате JPEG:
Чтение размеров JPEG на C ++ без чтения всего файла
Чтение размеров JPEG в C # без чтения всего файла
Чтение размеров JPEG в Java без чтения всего файла
Java / ImageIO получает размеры изображения без чтения всего файла?
Информация заголовка JPEG
http://web.archive.org/web/20080224153210/http://www.obrador.com/essentialjpeg/headerinfo.htm