Do you mean when you are a server or client?
If you are a server, you can find out everything that you could find in any other file (if the image stream comes from the file).
new FileInfo(path).Length;
If you mean that you are doing client code (you are gaining access to another web server)
Make a HEAD request. Although some servers behave incorrectly, the correct response to HEAD is pretty much identical to the GET rule, except that the object has not been sent.
For example, to get the PNG sprite that is used on this page, the browser performs a GET at http://sstatic.net/stackoverflow/img/sprites.png , which leads to the answer:
HTTP/1.1 200 OK Server: nginx Date: Tue, 17 Aug 2010 01:06:21 GMT Content-Type: image/png Connection: keep-alive Cache-Control: max-age=604800 Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT Accept-Ranges: bytes X-Powered-By: ASP.NET Content-Length: 18607
followed by octets of the real image file.
Doing HEAD instead of getting results:
HTTP/1.1 200 OK Server: nginx Date: Tue, 17 Aug 2010 01:07:20 GMT Content-Type: image/png Connection: keep-alive Cache-Control: max-age=604800 Content-Length: 18607 Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT Accept-Ranges: bytes X-Powered-By: ASP.NET
pretty much the same , but without the body of the object . At this stage, we see that the image is 18607 bytes in size, without actual loading. This method will not work, although if the image is sent and then the length of the content will not be sent in the header.
Edit:
It is worth noting that sometimes with fragmented content you will have no choice but to download all this, because the server will not say (and do not even know) the size when sending it. Unfortunately, this is likely to be used with especially large threads. Fortunately, this is unlikely to be used with images.