ニュース記事を含む HTML ページが与えられた場合、記事から関連する画像を検出しようとしています。このために、画像のサイズを確認していますが (小さすぎる場合は、ナビゲーション要素である可能性があります)、すべての画像をダウンロードしたくありません。
画像全体をダウンロードせずに画像の幅と高さを取得する方法はありますか?
ニュース記事を含む HTML ページが与えられた場合、記事から関連する画像を検出しようとしています。このために、画像のサイズを確認していますが (小さすぎる場合は、ナビゲーション要素である可能性があります)、すべての画像をダウンロードしたくありません。
画像全体をダウンロードせずに画像の幅と高さを取得する方法はありますか?
それがあなたのアプリケーションをスピードアップするのに役立つかどうかはわかりませんが、それは可能です。これらの2つの記事をチェックしてください:
http://www.anttikupila.com/flash/getting-jpg-dimensions-with-as3-without-loading-the-entire-file/ for JPEG
PNGの場合はhttp://www.herrodius.com/blog/265
これらは両方とも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;
}
}
}
編集:私はPythonの専門家ではありませんが、この記事では、Python libがまさにそれを実行していることを説明しているようです(最後のサンプル):http ://effbot.org/zone/pil-image-size.htm
いいえ、できません。img
ただし、タグから情報を取得できますが、背景からは取得できません。