Avatar billede trer Nybegynder
29. januar 2004 - 10:04 Der er 4 kommentarer og
1 løsning

Aflæs JPG højde og bredde i ASP

Jeg har brug for en metode (gerne en funktion) der tillader et ASP script (okay, en stump VB kode) at aflæse højde og bredde på et JPG billede.

Metoden må ikke benytte diverse specielle COM objekter da den skal være kompatibel både med Microsoft ASP og ChiliASP (Og jeg i øvrigt ikke kan registere objekter hos min webudbyder).

Højde og bredde skal bruges i layoutberegninger serverside, så koden skal være rent serverside.

Håber nogen kan hjælpe...
Avatar billede keysersoze Ekspert
29. januar 2004 - 10:26 #1
javascript kan til dels - men det er jo klientside. ASP har jeg aldrig set kunnet gøre det da ASP ikke på den måde kan arbejde med billeder - normalt bruger man komponenter såsom ASPimage eller Shotgraph, så jeg tror desværre at du leder i blinde :o/
Avatar billede trer Nybegynder
29. januar 2004 - 13:49 #2
Jeg kan ikke se, at der skulle være nogen problemer i at gøre det via ASP / VB script:

Åben JPG-filen via FileSystemObject, gå gennem bitstrømmen til man finder højde og bredde oplysningerne, returnere dem og lukke FileSystemObject igen.

Eneste problem jeg selv har med at gøre det er, at jeg ikke kender nok til grafiske formater til at fortolke JPG formatets header informationer.
Avatar billede eagleeye Praktikant
29. januar 2004 - 17:49 #3
Du kan prøve dette som bruger FSO til at læser information ud fra filerne.
Support for BMP, GIF, JPG og PNG.


<html>
<head>
<title></title>
</head>
<body>

<%
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::                                                            :::
  ':::  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




'HER ER KODEN SOM UDSKRIVER ALLE BILLEDE FILE (JPG,GIF) FRA DEN FOLDER ASP FILEN
'LIGGER I
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::    TESTE KODE                                                :::
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
Set objFSO = CreateObject("Scripting.FileSystemObject")

'Ret stien til den folder du har asp og billerne i : . = current folder
Set objF = objFSO.GetFolder(Server.MapPath("."))
 
Set objFC = objF.Files

response.write "<table border=""0"" cellpadding=""5"">"
response.write "<tr><td>Filnavn</td><td>Dato</td><td>Størrelse (bytes)</td><td>højde X bredde</td><td>Antal farver</td><td>billede</td></tr>"
For Each f1 in objFC
  if instr(ucase(f1.Name), ".GIF") OR instr(ucase(f1.Name), ".JPG") then
    response.write "<tr><td>" & f1.name & "</td><td>" & f1.DateCreated & "</td><td>" & f1.Size & "</td><td>"

    'Kalder function som returnere størrelsen på billet
    if gfxSpex(server.MapPath(f1.Name), intWidth, intHigh, intColor, strType) = true then
      'Udskriv billede størrelsen
      response.write intHigh & " x " & intWidth
     
      response.write "</td><td>" & intColor
      response.write "</td><td>"

      'Definer MAX hight og width
      maxHigh = 250
      maxWidth = 300

      fixedHigh = false
 
      'Kode som udregner hight og width ud fra billede størrelese og MAS hight og width
      if (intWidth > maxWidth) AND (intHigh > maxHigh) then
        if (intWidth/maxWidth) < (intHigh/maxHigh) then
          fixedHigh = true
        end if
      elseif (intHigh > maxHigh) then
        fixedHigh = true
      elseif (intHigh > intWidth) then
        fixedHigh = true
      end if 
 
      'Udskriver billede tagen
      if fixedHigh = true then
        Response.Write "<img src=""" & (f1.Name) & """ width=""" & Int(intWidth/(intHigh/maxHigh)) & """ hight=""" & maxHigh & """>"
      else
        Response.Write "<img src=""" & (f1.Name) & """ width=""" & maxWidth & """ hight=""" & Int(intHigh/(intWidth/maxWidth)) & """>"
      end if

    end if
    response.write "</td></tr>"
  end if
Next

response.write "</table>"

set objFC = nothing
set objF = nothing
set objFSO = nothing
%>

</body>
</html>
Avatar billede trer Nybegynder
29. januar 2004 - 21:20 #4
eagleeye> Smid et svar - det var præcis hvad jeg søgte (om mere til, da GIF og PNG også er dækket)!

Og nu slipper jeg så for at sætte mig ind i JPEG Interchange File specification :-)
Avatar billede eagleeye Praktikant
29. januar 2004 - 21:23 #5
Ok her et svar ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester