Как определить размер изображения, не загружая его (полностью)? - PullRequest
11 голосов
/ 17 сентября 2011

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

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

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

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

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

Кто-нибудь был в состоянии соединить части (без или с ImageMagick)?

Ответы [ 4 ]

6 голосов
/ 02 апреля 2015

Как насчет использования функции ping ImageMagick, как это:

identify -ping -format "%wx%h" http://www.google.com/logos/giroux1.jpg
482x142
4 голосов
/ 17 сентября 2011

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

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

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

Во всяком случае, я не уверен, что преимущества оправдают время, которое вы тратите на это. 200 тыс. - ничто в наше время.

3 голосов
/ 19 сентября 2011

Мне удалось ответить на мой собственный вопрос, и я включил фрагмент кода 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;
}
2 голосов
/ 02 апреля 2015

Улучшенная версия ответа Донахью выше. Этот извлекает меньшие диапазоны байтов для файлов 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...