?
Solved

Get image width in Classic ASP

Posted on 2012-03-14
8
Medium Priority
?
1,039 Views
Last Modified: 2012-03-25
Hi all

Here's the code I'm using at the moment:

<article>
<%
IF (rsPageContent.Fields.Item("ArticleImage").Value) <> "" THEN
%>
    <figure> <img src="images/<%=(rsPageContent.Fields.Item("ArticleImage").Value)%>"> </figure>
    <h1><%=(rsPageContent.Fields.Item("ArticleTitle").Value)%></h1>
    <%=(rsPageContent.Fields.Item("ArticleContent").Value)%>
<%
ELSE
%>
    <h1><%=(rsPageContent.Fields.Item("ArticleTitle").Value)%></h1>
    <%=(rsPageContent.Fields.Item("ArticleContent").Value)%>
<%
END IF
%>
</article>

Open in new window


What I'm after is something along the lines of ...

<article>
<%
IF (rsPageContent.Fields.Item("ArticleImage").Value) <> "" THEN
%>
    <figure> <img src="images/<%=(rsPageContent.Fields.Item("ArticleImage").Value)%>"> </figure>
    <h1><%=(rsPageContent.Fields.Item("ArticleTitle").Value)%></h1>
    <%=(rsPageContent.Fields.Item("ArticleContent").Value)%>

' New code here...
<%
    ELSE IF width of (rsPageContent.Fields.Item("ArticleImage").Value) < 400px THEN
%>
    <h1><%=(rsPageContent.Fields.Item("ArticleTitle").Value)%></h1>
    <img src="images/<%=(rsPageContent.Fields.Item("ArticleImage").Value)%>" class="storyImage"><%=(rsPageContent.Fields.Item("ArticleContent").Value)%>

' Continuation of code
<%
ELSE
%>
    <h1><%=(rsPageContent.Fields.Item("ArticleTitle").Value)%></h1>
    <%=(rsPageContent.Fields.Item("ArticleContent").Value)%>
<%
END IF
%>
</article>

Open in new window


Hope it makes sense.

Thanks in advance

Pb
0
Comment
Question by:Martin Cotterill
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 2
  • 2
8 Comments
 
LVL 29

Expert Comment

by:sammySeltzer
ID: 37723050
If you can just describe in your own words what you are trying to accomplish, perhaps we can help.
0
 
LVL 1

Author Comment

by:Martin Cotterill
ID: 37724088
I want to get the width of an image so that if it's less than a certain width then the position of the image changes.

Because there is a large image for the opening of the page and the others are smaller (if they exist), I did think of doing a whole raft of 'IF.. THEN... ELSE...'. IE:

IF Record 1 has an image THEN
display the info this way

ELSE IF The record is greater than 1 and has an image THEN
display the info this way

ELSE IF The record is greater than 1 and has an image that is smaller than this size THEN
display the info this way

ELSE
display the info this way

END IF

Open in new window


I basically want a way of getting the image width although I think I've just answered my own question. If I force the width of the image to be a no bigger than a certain size through CSS it may solve the problem.

Pb
0
 
LVL 25

Expert Comment

by:kevp75
ID: 37725276
Try:
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
':::  This routine will attempt to identify any filespec passed  :::'
':::  as a graphic file (regardless of the extension). This will :::'
':::  work with BMP, GIF, JPG and PNG files.                     :::'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::          Based on ideas presented by David Crowell          :::'
':::                   (credit where due)                        :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
'::: blah blah blah blah blah blah blah blah blah blah blah blah :::'
'::: blah blah blah blah blah blah blah blah blah blah blah blah :::'
'::: blah blah     Copyright *c* MM,  Mike Shaffer     blah blah :::'
'::: blah blah      ALL RIGHTS RESERVED WORLDWIDE      blah blah :::'
'::: blah blah  Permission is granted to use this code blah blah :::'
'::: blah blah   in your projects, as long as this     blah blah :::'
'::: blah blah      copyright notice is included       blah blah :::'
'::: blah blah blah blah blah blah blah blah blah blah blah blah :::'
'::: blah blah blah blah blah blah blah blah blah blah blah blah :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'

':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
':::  This function gets a specified number of bytes from any    :::'
':::  file, starting at the offset (base 1)                      :::'
':::                                                             :::'
':::  Passed:                                                    :::'
':::       flnm        => Filespec of file to read               :::'
':::       offset      => Offset at which to start reading       :::'
':::       bytes       => How many bytes to read                 :::'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
function GetBytes(flnm, offset, bytes)

 Dim objFSO
 Dim objFTemp
 Dim objTextStream
 Dim lngSize

 on error resume next

 Set objFSO = CreateObject("Scripting.FileSystemObject")

 ' First, we get the filesize'
 Set objFTemp = objFSO.GetFile(flnm)
 lngSize = objFTemp.Size
 set objFTemp = nothing

 fsoForReading = 1
 Set objTextStream = objFSO.OpenTextFile(flnm, fsoForReading)

 if offset > 0 then
    strBuff = objTextStream.Read(offset - 1)
 end if

 if bytes = -1 then        ' Get All!'

    GetBytes = objTextStream.Read(lngSize)  'ReadAll'

 else

    GetBytes = objTextStream.Read(bytes)

 end if

 objTextStream.Close
 set objTextStream = nothing
 set objFSO = nothing

end function


':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
':::  Functions to convert two bytes to a numeric value (long)   :::'
':::  (both little-endian and big-endian)                        :::'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
function lngConvert(strTemp)
 lngConvert = clng(asc(left(strTemp, 1)) + ((asc(right(strTemp, 1)) * 256)))
end function

function lngConvert2(strTemp)
 lngConvert2 = clng(asc(right(strTemp, 1)) + ((asc(left(strTemp, 1)) * 256)))
end function


':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
':::  This function does most of the real work. It will attempt  :::'
':::  to read any file, regardless of the extension, and will    :::'
':::  identify if it is a graphical image.                       :::'
':::                                                             :::'
':::  Passed:                                                    :::'
':::       flnm        => Filespec of file to read               :::'
':::       width       => width of image                         :::'
':::       height      => height of image                        :::'
':::       depth       => color depth (in number of colors)      :::'
':::       strImageType=> type of image (e.g. GIF, BMP, etc.)    :::'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
function gfxSpex(flnm, width, height, depth, strImageType)

 dim strPNG 
 dim strGIF
 dim strBMP
 dim strType
 strType = ""
 strImageType = "(unknown)"

 gfxSpex = False

 strPNG = chr(137) & chr(80) & chr(78)
 strGIF = "GIF"
 strBMP = chr(66) & chr(77)

 strType = GetBytes(flnm, 0, 3)

 if strType = strGIF then                ' is GIF'

    strImageType = "GIF"
    Width = lngConvert(GetBytes(flnm, 7, 2))
    Height = lngConvert(GetBytes(flnm, 9, 2))
    Depth = 2 ^ ((asc(GetBytes(flnm, 11, 1)) and 7) + 1)
    gfxSpex = True

 elseif left(strType, 2) = strBMP then        ' is BMP'

    strImageType = "BMP"
    Width = lngConvert(GetBytes(flnm, 19, 2))
    Height = lngConvert(GetBytes(flnm, 23, 2))
    Depth = 2 ^ (asc(GetBytes(flnm, 29, 1)))
    gfxSpex = True

 elseif strType = strPNG then            ' Is PNG'

    strImageType = "PNG"
    Width = lngConvert2(GetBytes(flnm, 19, 2))
    Height = lngConvert2(GetBytes(flnm, 23, 2))
    Depth = getBytes(flnm, 25, 2)

    select case asc(right(Depth,1))
       case 0
          Depth = 2 ^ (asc(left(Depth, 1)))
          gfxSpex = True
       case 2
          Depth = 2 ^ (asc(left(Depth, 1)) * 3)
          gfxSpex = True
       case 3
          Depth = 2 ^ (asc(left(Depth, 1)))  '8'
          gfxSpex = True
       case 4
          Depth = 2 ^ (asc(left(Depth, 1)) * 2)
          gfxSpex = True
       case 6
          Depth = 2 ^ (asc(left(Depth, 1)) * 4)
          gfxSpex = True
       case else
          Depth = -1
    end select


 else

    strBuff = GetBytes(flnm, 0, -1)        ' Get all bytes from file'
    lngSize = len(strBuff)
    flgFound = 0

    strTarget = chr(255) & chr(216) & chr(255)
    flgFound = instr(strBuff, strTarget)

    if flgFound = 0 then
       exit function
    end if

    strImageType = "JPG"
    lngPos = flgFound + 2
    ExitLoop = false

    do while ExitLoop = False and lngPos < lngSize

       do while asc(mid(strBuff, lngPos, 1)) = 255 and lngPos < lngSize
          lngPos = lngPos + 1
       loop

       if asc(mid(strBuff, lngPos, 1)) < 192 or asc(mid(strBuff, lngPos, 1)) > 195 then
          lngMarkerSize = lngConvert2(mid(strBuff, lngPos + 1, 2))
          lngPos = lngPos + lngMarkerSize  + 1
       else
          ExitLoop = True
       end if

   loop

   if ExitLoop = False then

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

   else

      Height = lngConvert2(mid(strBuff, lngPos + 4, 2))
      Width = lngConvert2(mid(strBuff, lngPos + 6, 2))
      Depth = 2 ^ (asc(mid(strBuff, lngPos + 8, 1)) * 8)
      gfxSpex = True

   end if

 end if

end function

Open in new window


Demo Usage:
'collect the image information into an array'
Dim blnGfxSpex, width, height, colors, strType
intCount = 0
For Each objFile In objFS.GetFolder(".\images").Files
    If LCase(Right(objFile.Name, 4)) = ".jpg" and intCount <= intNumOfFiles Then
        blnGfxSpex = gfxSpex((".\images\" & objFile.Name), width, height, colors, strType)

        arrImages(intCount) = "<image>" & vbNewLine & _
                                "<filename>" & objFile.Name & "</filename>" & vbNewLine & _
                                "<caption></caption>" & vbNewLine & _
                                "<width>" & width & "</width>" & vbNewLine & _
                                "<height>" & height & "</height>" & vbNewLine & _
                                "</image>" & vbNewLine
        intCount = intCount + 1
    End If
Next

Open in new window

0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 1

Author Comment

by:Martin Cotterill
ID: 37725640
Ye Gods Kevp75

That's a lot of work just to find the width of an image!
0
 
LVL 29

Assisted Solution

by:sammySeltzer
sammySeltzer earned 1000 total points
ID: 37725704
Sorry I am late on this and have been very busy.

Why not try something really simple?

Depending on *how* you are getting the image, I would try:


//Set your dimension threshold. This means that if widht is larger than imgWidth, then I use imaWidth; otherwise, I use the current image width.

imgWidth="400"
imgHeight="450"

These are just numbers I made up.

You would then do:

If rsPageContent.Fields.Item("ArticleImage").Value) > imgWidth then 'use imgWidth
%>
<input type=text name=imgtest value="<%=imgWidth%>">
<% else%>
<input type=text name=imgtest value="<%=(rsPageContent.Fields.Item("ArticleImage")%>">
<%end if%>

You don't need a bunch of if statements.
0
 
LVL 25

Accepted Solution

by:
kevp75 earned 1000 total points
ID: 37725743
Well.  Unless you are going to use a 3rd party component.  then that is the only way.

Otherwise, you will need to specify the width/height of the images manually

Sorry guy!...      .Net can do it on it's own, Classic ASP cannot
0
 
LVL 1

Author Comment

by:Martin Cotterill
ID: 37763295
Sorry for taking so long to get back to everyone but domesticity interferes at the most inappropriate moments.

Any hoo....

Thanks Sammy for the code as it gave me an idea. As suggested by levp75, I made another field in the record that holds the image width. I can use the field to see if the image is larger than a particular width and then the If... Then... Else statement takes care of the rest.

Brill.

Many thanks to all who answered my question.

Pb
0
 
LVL 1

Author Closing Comment

by:Martin Cotterill
ID: 37763301
Thanks to Sammy and Kev, I had a 'Why didn't I think of that?' moment.

Sometimes you can't see the wood for the trees and both these guys came out with a couple of chainsaws and a pair of glasses.
0

Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I have helped a lot of people on EE with their coding sources and have enjoyed near about every minute of it. Sometimes it can get a little tedious but it is always a challenge and the one thing that I always say is:   The Exchange of informatio…
I would like to start this tip/trick by saying Thank You, to all who said that this could not be done, as it forced me to make sure that it could be accomplished. :) To start, I want to make sure everyone understands the importance of utilizing p…
Michael from AdRem Software outlines event notifications and Automatic Corrective Actions in network monitoring. Automatic Corrective Actions are scripts, which can automatically run upon discovery of a certain undesirable condition in your network.…
This is my first video review of Microsoft Bookings, I will be doing a part two with a bit more information, but wanted to get this out to you folks.
Suggested Courses

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question