Retrieving Remote Image Properties in ASP

Recently, my friends and I decided to make a site similar to www.hotornot.com. We wanted to allow users to just put the URL of an image they want displayed on the site and the image would eventually be displayed. However, some people put images that were too large and distorted the layout of the website. We attempted to make every image a set length and width, but that was disproportional and stretched out most of the images. I found a file by Mike Shaffer called IMGSZ. I attempted to make the script work with local files, but I had troubles. I wrote a file based on the size defining algorithms in IMGSZ that would also pull the image from a remote website using XML. It works very similarly to what IMGSZ should and I would like to note his help on this. The only flaw is that it only supports GIF and JPG files, which are the only files I needed to support.

The syntax to use getSize is as follows:

someBoolean = getSize(URL, width, height, depth, flType)

  • someBoolean will be set to true or false based on whether the script was able to determine the images attributes
  • URL is an input stating the URL of the image, such as http://www.4guysfromrolla.com/images/newbanner.gif
  • Width will be set to the width of the image, or –1 if the script failed
  • Height will be set to the height of the image, or –1 if the script failed
  • Depth will be set to the depth of the image, or –1 if the script failed
  • FlType will be set to the type of file the image was, GIF or JPG

A major problem with IMGSZ was that it did not use binary string functions such as midb and lenb. Since all images are binary, these functions are required opposed to mid and len.

'This script was written by Lawrence Finn'
'Anyone is free to use this file or alter it at their discretion.
' lngconvert and lngconvert2 were written by Mike Shaffer
'The rest is based on his file IMGSZ with major modifications
'...now it actually works!

  function GetBytes(objHTTP, offset, bytes)

    Dim SizeofFile
    on error resume next
    SizeofFile = objHTTP.getResponseHeader("Content-Length")
    'gets the size of the file from the HTTP header    
    if offset > 0 then 'start getting bytes NOT at the beginning
    strbuff = midb(objHTTP.responseBody, offset, bytes)
    end if
    if bytes = -1 then        ' Get All!
       GetBytes = objHTTP.responseBody  'ReadAll
    else 'start at front and go some odd distance
       GetBytes = midb(objHTTP.responseBody, 1, bytes)
    end if
 end function


 function lngConvert(strTemp)
    lngConvert = clng(ascb(leftb(strTemp, 1)) + ((ascb(rightb(strTemp, 1)) * 256)))
 end function

 function lngConvert2(strTemp)
    lngConvert2 = clng(ascb(rightb(strTemp, 1)) + ((ascb(leftb(strTemp, 1)) * 256)))
 end function
'''''lngconvert was taken from Mike Shaffer's IMGSZ
 
   function getSize(URL, width, height, depth, flType)

    dim PNGflType
    dim GIFflType
    dim BMPflType
    dim flTypeOf
    dim obj
    flTypeOf = ""
    flType = "(unknown)"
    Set obj = Server.CreateObject ("Microsoft.XMLHTTP")
    obj.open "GET", URL, False
    obj.send
    'Here we have gotten the data for the image file
    getSize = False
    PNGflType = chr(137) & chr(80) & chr(78)
    GIFflType = chrb(71) & chrb(73) & chrb(70)
    BMPflType = chr(66) & chr(77)
    'Here are the definitions for the image flTypes, I only support GIF and JPG but you can add others :)
    flTypeOf = GetBytes(obj, 0, 3)
    'Find out what flType of image it is
    if flTypeOf = GIFflType then    'It is a GIF!!!
    flType = "GIF"    
    strbuffer = getbytes(obj, 0, -1) 'get all of the data of the image
    width= lngconvert(midb(strbuffer, 7, 2))
    Height = lngconvert(midb(strbuffer, 9, 2))
    Depth = 2 ^ ((ascb(GetBytes(obj, 11, 1)) and 7) + 1)
    'It is very important to note the ascB and midB, images ARE binary files
    getSize = True
    else
    strBuff = GetBytes(obj, 0, -1)        ' get the entire file
    SizeofFile = lenb(strBuff)
    flgFound = 0
    strTarget = chrb(255) & chrb(216) & chrb(255)
    flgFound = instrb(strBuff, strTarget)
    char = (midb(strbuff, 1, 3)) 'check out the first few characters
    if flgFound = 0 then 'not a jpg, and definatly not a GIF
     exit function
    end if
    flType = "JPG"
    lngPos = flgFound + 2
    ExitLoop = false
    do while ExitLoop = False and lngPos < SizeofFile
          do while ascb(midb(strBuff, lngPos, 1)) = 255 and lngPos < SizeofFile
             lngPos = lngPos + 1
          loop
          'search through to find the data
          if ascb(midb(strBuff, lngPos, 1)) < 192 or ascb(midb(strBuff, lngPos, 1)) > 195 then
             lngMarkerSize = lngConvert2(midb(strBuff, lngPos + 1, 2))
             lngPos = lngPos + lngMarkerSize  + 1
          else
             ExitLoop = True 'have everything we need
          end if

    loop

          if ExitLoop = False then 'oh no!

             Width = -1
             Height = -1
             Depth = -1
   
          else

             Height = lngConvert2(midb(strBuff, lngPos + 4, 2))
             Width = lngConvert2(midb(strBuff, lngPos + 6, 2))
             Depth = 2 ^ (ascb(midb(strBuff, lngPos + 8, 1)) * 8)
             getSize = True

          end if
                 
    end if
 
 set obj = Nothing
 end function

You might also like...

Comments

 LawrenceF

Contribute

Why not write for us? Or you could submit an event or a user group in your area. Alternatively just tell us what you think!

Our tools

We've got automatic conversion tools to convert C# to VB.NET, VB.NET to C#. Also you can compress javascript and compress css and generate sql connection strings.

“Engineers are all basically high-functioning autistics who have no idea how normal people do stuff.” - Cory Doctorow