Можно ли определить размеры изображения по URL без загрузки всего изображения? - PullRequest
4 голосов
/ 13 февраля 2011

Учитывая HTML-страницу с новостной статьей, я пытаюсь найти соответствующие изображения из этой статьи.Для этого я смотрю на размеры изображений (если они слишком малы, вероятно, они являются элементами навигации), но я не хочу загружать каждое изображение.

Есть ли способ получитьширина и высота изображения без загрузки полного изображения?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2011

Не знаю, поможет ли это ускорить ваше приложение, но это можно сделать. Оформить заказ на эти две статьи:

http://www.anttikupila.com/flash/getting-jpg-dimensions-with-as3-without-loading-the-entire-file/ для JPEG

http://www.herrodius.com/blog/265 для PNG

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

Я сделал образец, используя C #. Это не самый красивый код, и он работает только для JPEG, но может быть легко расширен и на PNG:

var request = (HttpWebRequest) WebRequest.Create("http://unawe.org/joomla/images/materials/posters/galaxy/galaxy_poster2_very_large.jpg");
using (WebResponse response = request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
{
    int r;
    bool found = false;
    while (!found && (r = responseStream.ReadByte()) != -1)
    {
        if (r != 255) continue;

        int marker = responseStream.ReadByte();

        // App specific
        if (marker >= 224 && marker <= 239)
        {
            int payloadLengthHi = responseStream.ReadByte();
            int payloadLengthLo = responseStream.ReadByte();
            int payloadLength = (payloadLengthHi << 8) + payloadLengthLo;
            for (int i = 0; i < payloadLength - 2; i++)
                responseStream.ReadByte();
        }
        // SOF0
        else if (marker == 192)
        {
            // Length of payload - don't care
            responseStream.ReadByte();
            responseStream.ReadByte();

            // Bit depth - don't care
            responseStream.ReadByte();

            int widthHi = responseStream.ReadByte();
            int widthLo = responseStream.ReadByte();
            int width = (widthHi << 8) + widthLo;

            int heightHi = responseStream.ReadByte();
            int heightLo = responseStream.ReadByte();
            int height = (heightHi << 8) + heightLo;

            Console.WriteLine(width + "x" + height);
            found = true;
        }
    }
}

EDIT: Я не эксперт по Python, но эта статья, кажется, описывает библиотеку Python, которая делает именно это (последний пример): http://effbot.org/zone/pil-image-size.htm

1 голос
/ 13 февраля 2011

Нет, это невозможно. Но вы можете получить информацию из тегов img, но не из фонов.

...