Avatar billede dingkee Nybegynder
18. december 2002 - 21:12 Der er 11 kommentarer og
1 løsning

automatisk tilpasning af billeder

Kan man lave et script der for billeder til at tilpasse sig automatisk.

F.eks. har jeg to billeder:

Billed 1:
Bredde = 200
Højde = 400

Billed 2:
Bredde = 100
Højde = 400

Jeg vil have en maks bredde på 50
Kan man så lave sådan at den automatisk laver billed 1's højde 100 og billed 2's højde 200

Så det kommer til at se godt ud
Avatar billede steen_hansen Forsker
18. december 2002 - 21:20 #1
Det kræver nok en komponent, f.eks. ASPImage 2.0, for at det bliver godt ...
Avatar billede eagleeye Praktikant
18. december 2002 - 21:41 #2
Vil du også ændre den fysike størrelse af billet?

For eller kan man finde størrelsen af billet med FSO og et par functioner og så resize i image tagen med hight og width, men det ændre ikke fil størrelsen som man kunne gøre med ASPImage.
Avatar billede dingkee Nybegynder
18. december 2002 - 21:52 #3
Det skal kun resize, altså ikke ændre på selve filstørelsen
Avatar billede dingkee Nybegynder
18. december 2002 - 22:10 #4
Billederne skal ikke gemmes i det resizede, men kun laves om på den ene side
Avatar billede eagleeye Praktikant
18. december 2002 - 22:16 #5
Det kan gøre med FSO eller har du adgang til imgSize kompunenten?


Disse function kan du ligge i bunden af din kode og de bruger FSO til at find størrelsen på et billed.

<%
  ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  ':::                                                            :::
  ':::  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
%>
Avatar billede eagleeye Praktikant
18. december 2002 - 22:17 #6
Så kan du ligge dette kode ind som viser billet:


<%
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
':::    TESTE KODE                                                :::
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set f1 = objFSO.GetFile(Server.MapPath("34thinking.jpg"))
if instr(ucase(f1.Name), ".GIF") OR instr(ucase(f1.Name), ".JPG") then
  'Kalder function som returnere størrelsen på billet
  if gfxSpex(server.MapPath(f1.Name), intWidth, intHigh, intColor, strType) = true then
  'Definer MAX hight og width
    maxWidth = 50
 
    fixWidth = false
    if (intWidth > maxWidth) then
      fixWidth = true
    end if

    'Udskriver billede tagen
    if fixWidth = true then
      Response.Write "<img src=""" & (f1.Name) & """ width=""" & maxWidth & """ hight=""" & Int(intHigh/(intWidth/maxWidth)) & """>"
    else
      Response.Write "<img src=""" & (f1.Name) & """ width=""" & intWidth & """ hight=""" & intHigh & """>"
    end if

  end if
end if

set f1 = nothing
set objFSO = nothing
%>
Avatar billede dingkee Nybegynder
18. december 2002 - 22:31 #7
Nu er det sådan at jeg skal hente billedets navn fra en database + der er omkring 30 billeder den skal vise...

Hvordan får jeg det ind i koden?
Avatar billede dingkee Nybegynder
18. december 2002 - 22:36 #8
er det letteste ikk at kalde dimensioner på billederne, og så indsætte denne linie:
""" width=""" & maxWidth & """ hight=""" & Int(intHigh/(intWidth/maxWidth)) &

Ved bare ikk helt hvor jeg skal få, intHigh og intWidth fra
Avatar billede eagleeye Praktikant
18. december 2002 - 22:37 #9
I denne linie sættes filnavnet:

Set f1 = objFSO.GetFile(Server.MapPath("34thinking.jpg"))

Hvad ligger i databasen bare filnavet eller filnavn + sti?
Avatar billede dingkee Nybegynder
18. december 2002 - 22:39 #10
har faktisk fundet ud af hvordan man gør ved at rode lidt med koden, det er denne linie der skal bruges:

width='150' hight='Int(intHigh/(intWidth/150))'>

Men tak for den hjælp jeg fik :)
Avatar billede eagleeye Praktikant
18. december 2002 - 22:40 #11
Det leteste er at define en fast højde og brede i image tagen:

<img src="fil.jpg" width="50" hight="200">

men så vil det jo se sjovt ud for nogle billeder hvis højde svinder meget. Så derfor er der lavet en function som tjekke på størrelsen på billet:
if gfxSpex(server.MapPath(f1.Name), intWidth, intHigh, intColor, strType) = true then

og ud fra breden i forhold til max brede sættes højden:
Response.Write "<img src=""" & (f1.Name) & """ width=""" & maxWidth & """ hight=""" & Int(intHigh/(intWidth/maxWidth)) & """>"
Avatar billede eagleeye Praktikant
18. december 2002 - 22:40 #12
ok :)
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

IT-JOB