Avatar billede axkris Nybegynder
02. maj 2003 - 09:23 Der er 9 kommentarer og
1 løsning

Gem fil og komprimer igen

Hej

Jeg har nedenstående funktion, som skal kompimere en fil og derefter skal den vente lidt og komprimere den igen, hvis ikke filen er blevet lille nok. Men det virker ikke, fordi når den har komprimeret filen først gang, er filens størrelse blevet 0 kb. Mystisk! :-)

Den skriver:

str = 95061
størrelse: 95061
Venter, så filen gemmes helt færdig inden næste komprimering...
Venter, så filen gemmes helt færdig inden næste komprimering...
.
.
.
Venter, så filen gemmes helt færdig inden næste komprimering...
Venter, så filen gemmes helt færdig inden næste komprimering...
er færdigkomprimeret 0

___________________________________________________

function setSize(strNavn)

    Set FS = CreateObject("Scripting.FileSystemObject")
    FileName = Server.MapPath (strNavn)

    Set Image = Server.CreateObject("AspImage.Image")
    Image.LoadImage(FileName)
    'resize for at at teste om scriptet overhovedet kan komprimere
    Image.resize 500, 1000
    Image.FileName = (FileName)
    Image.SaveImage
 
    Set Image = Server.CreateObject("AspImage.Image")
    Set newfile = FS.GetFile(FileName)
    fsize = newfile.size

    If inStr(strNavn, ".jpg") or inStr(strNavn, ".jpeg") then
        do while fsize > 10000
            response.write "str = " &  fsize & "<br>"
            response.write "<br>størrelse: " & newfile.size
            Image.JPEGQuality = 80
            Image.FileName = (FileName)
            Image.SaveImage
   
            set newfile = nothing   
            i = 0
            for i = 1 to 10000
                response.write "<br>Venter, så filen gemmes helt færdig inden næste komprimering..."
            next

            Set newfile = FS.GetFile(FileName)
            fsize = newfile.size
        loop
            response.write "<br>er færdigkomprimeret " & fsize
    else
        sendBack("Billedet var for stort og kunne ikke gøres mindre, da der ikke er tale om en JPG-fil")
    end if

Set Image = nothing
         
end function
Avatar billede dk_akj Nybegynder
02. maj 2003 - 10:03 #1
Prøver igen :-)

function setSize(strNavn)

    Set FS = CreateObject("Scripting.FileSystemObject")
    FileName = Server.MapPath (strNavn)

    Set Image = Server.CreateObject("AspImage.Image")
    Image.LoadImage(FileName)
    'resize for at at teste om scriptet overhovedet kan komprimere
    Image.resize 500, 1000
    Image.FileName = (FileName)
    Image.SaveImage
 
    Set Image = Server.CreateObject("AspImage.Image")
    Set newfile = FS.GetFile(FileName)
    fsize = newfile.size

    If inStr(strNavn, ".jpg") or inStr(strNavn, ".jpeg") then
        do while fsize > 10000
            response.write "str = " &  fsize & "<br>"
            response.write "<br>størrelse: " & newfile.size
            Image.JPEGQuality = 80
            Image.FileName = (FileName)
            Image.SaveImage
   
            set newfile = nothing   



    nsize = fsize

    ' loop intil filstr er ændret
            do until nsize <> fsize
                doevents
        sleep 50

                set tempfile = nothing   
                Set tempfile = FS.GetFile(FileName)
                nsize =tempfile.size


        response.write "<br>Venter, så filen gemmes helt færdig inden næste komprimering..."
            loop

            Set newfile = FS.GetFile(FileName)
            fsize = newfile.size
        loop
            response.write "<br>er færdigkomprimeret " & fsize
    else
        sendBack("Billedet var for stort og kunne ikke gøres mindre, da der ikke er tale om en JPG-fil")
    end if

Set Image = nothing
         
end function

//akj
Avatar billede axkris Nybegynder
02. maj 2003 - 12:37 #2
Hverken "doevents" eller "sleep 50" virker. Browseren stopper bare og kommer ikke videre ved begge linier.
Avatar billede axkris Nybegynder
02. maj 2003 - 12:52 #3
Jeg kan simpelt hen ikke få det til at virke lige meget, hvad jeg gør:

str = 95061
størrelse: 95061
Tid: 02-05-2003 12:46:41
Tid(2): 02-05-2003 12:47:31
Venter, så filen gemmes helt færdig inden næste komprimering...
er færdigkomprimeret 0
____________________________________________________________________

function setSize(strNavn)

    Set FS = CreateObject("Scripting.FileSystemObject")
    FileName = Server.MapPath (strNavn)

    Set Image = Server.CreateObject("AspImage.Image")
    Image.LoadImage(FileName)
    'resize for at at teste om scriptet overhovedet kan komprimere
    Image.resize 500, 1000
    Image.FileName = (FileName)
    Image.SaveImage
 
    Set Image = Server.CreateObject("AspImage.Image")
    Set newfile = FS.GetFile(FileName)
    fsize = newfile.size

    If inStr(strNavn, ".jpg") or inStr(strNavn, ".jpeg") then
        do while fsize > 10000
            response.write "<br>str = " &  fsize
            response.write "<br>størrelse: " & newfile.size
            Image.JPEGQuality = 80
            Image.FileName = (FileName)
            Image.SaveImage
           
            set newfile = nothing   
            nsize = fsize

            ' loop intil filstr er ændret
            do until nsize <> fsize
             
                Nu = Now
                  Response.Write("<br>Tid: " & Nu)
                do while (DateDiff("s", Nu, Now) < 50)
                    ' Bliver her i 50 sek
                  loop
                  Response.Write("<br>Tid(2): " & Now & "")
               
                set tempfile = nothing   
                Set tempfile = FS.GetFile(FileName)
                nsize = tempfile.size
                response.write "<br>Venter, så filen gemmes helt færdig inden næste komprimering..."
            loop

            Set newfile = FS.GetFile(FileName)
            fsize = newfile.size
        loop
            response.write "<br>er færdigkomprimeret " & fsize
    else
        sendBack("Billedet var for stort og kunne ikke gøres mindre, da der ikke er tale om en JPG-fil")
    end if

    Set Image = nothing
         
end function
Avatar billede dk_akj Nybegynder
02. maj 2003 - 15:49 #4
Både sleep og doevents skal være i scriptet-

Prøv evt denne komponent.
http://www.serverobjects.com/products.htm#free

Den hedder Wait For.

//akj
Avatar billede axkris Nybegynder
02. maj 2003 - 23:21 #5
>Både sleep og doevents skal være i scriptet-
Men hverken sleep eller doevents virker... browseren stopper bare og der sker ikke mere... jeg har ladet den så i lang tid og den kom ikke videre.

>Prøv evt denne komponent.
Jeg her ikke egen server

Hvad skal jeg så gøre?
Avatar billede dk_akj Nybegynder
03. maj 2003 - 07:02 #6
Jeg prøver lige at lave et helt nyt script hvis det er iorden ??

//akj
Avatar billede dk_akj Nybegynder
03. maj 2003 - 08:58 #7
Så er der et testet script :-)

maxsize = 400000  ' angiver den maximale størrelse
step = 5  ' angiver hvor meget kvaliteten skal  køres ned med i hvert loop
          ' jo lavere værdi du angiver jo tættere kommer du på target (maxsize) men det tager også længere tid.


//akj

function setSize(strNavn)


    maxsize = 400000
    step = 5

    FileName = Server.MapPath (strNavn)

    Set FS = CreateObject("Scripting.FileSystemObject")
    Set Image = Server.CreateObject("AspImage.Image")
   
    Set newfile = FS.GetFile(FileName)

    fsize = newfile.size   

    Image.LoadImage(FileName)
    ratio = Image.JPEGQuality
   
    if fsize > maxsize then
       
        do until clng(fsize) < clng(maxsize)
       
            ratio = ratio - step
       
            Image.LoadImage(FileName)
           
            Image.JPEGQuality = ratio
           
            response.write "ny kvali: " & Image.JPEGQuality & "<br>"
           
            Image.FileName = (FileName)
            Image.SaveImage
            Set newfile = FS.GetFile(FileName)
   
            fsize = newfile.size   
            response.write "ny størrelse: " & fsize & "<br>"
   
        loop
    end if
end function
Avatar billede axkris Nybegynder
03. maj 2003 - 13:43 #8
Nu virker det - mange, mange tak for hjælpen :-)

Den endelige kode blev:

function setSize(strNavn)

    Set FS = CreateObject("Scripting.FileSystemObject")
    FileName = Server.MapPath (strNavn)
    Set Image = Server.CreateObject("AspImage.Image")
    Image.LoadImage(FileName)
    Image.resize 80, 100
    Image.FileName = (FileName)
    Image.SaveImage

    'genfind billede
    Set newfile = FS.GetFile(FileName)

      'difiner max-størrelse - skal bruges senere
    maxsize = 10000
   
  'her starter jpg-komprimering 
    If inStr(findFileName(strNavn), ".jpg") or inStr(findFileName(strNavn), ".jpeg") then
   
        Set Image = Server.CreateObject("AspImage.Image")
        Image.LoadImage(FileName)
   
        if newfile.size > maxsize then
            do until clng(newfile.size) < clng(maxsize) or Image.JPEGQuality < 10   
                Image.LoadImage(FileName)
                  Image.FileName = (FileName)
                Image.JPEGQuality = Image.JPEGQuality - 5
                Image.SaveImage
               
                  'genfind billede
                Set newfile = FS.GetFile(FileName)
              loop
        end if
    end if
   
      if newfile.size > maxsize then
          fileDelete(strNAVN)
          sendBack("Billedet fylder for meget. Prøv med et andet billede, som fylder mindre.")
      end if

end function
Avatar billede dk_akj Nybegynder
03. maj 2003 - 13:46 #9
Selvtak. Fint at du lige sender den endelige kode hvis nogen skulle få brug for det samme.

//akj
Avatar billede axkris Nybegynder
03. maj 2003 - 13:48 #10
Det virker fint uden nogle former for "wait", så det er jo bare godt :-)
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