Avatar billede mettecarsten Nybegynder
09. juni 2006 - 13:08 Der er 10 kommentarer

Resize billede og gemme som andet filnavn

Jeg har idag et system, hvor brugerne kan uploade billeder, men de må ikke fylde mere end 50 kb. Det giver ofte problemer, da de meget ofte ikke kan finde ud af at få billedet under 50 kb. Jeg vil derfor gerne have det sådan, at brugerne kan uploade deres ikke-redigerede billeder, hvorefter de inden de bliver gemt bliver resized til størrelsen 300 x 200. Jeg har taget udgangspunkt i denne kode:

<%
function resize(sti,navn,nyX)
    Set objImg = Server.CreateObject("AspImage.Image")
        objImg.PadSize = 0
        objImg.LoadImage Server.MapPath(sti & navn)
        objImg.GetImageFileSize Server.MapPath(sti & navn), X, Y
   
        ResizedX = nyX
        objImg.MaxX = X
        objImg.MaxY = Y
   
        if X > ResizedX then
            ResizedY = (ResizedX / objImg.MaxX) * objImg.MaxY
            objImg.ResizeR ResizedX, ResizedY
            objImg.FileName = (Server.MapPath(sti & navn))
            objImg.SaveImage
        end if
   
    Set objImg = Nothing
end function

If Request("s") = "upload" Then

  Dim mySmartUpload
  Dim file1
  Dim intCount
  intCount=0

  Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload")

  mySmartUpload.Upload

  For each file1 In mySmartUpload.Files

      If not file1.IsMissing Then

        file1.SaveAs("/upload/" & file1.FileName)

        Response.Write("FileName = " & file1.FileName & "<br>")
        call resize("upload/",file1.FileName,140)
        Response.Write("<img src=""upload/" & file1.FileName & """ title=""Your uploaded image""><br>")
        intCount = intCount + 1
      End If
  Next

  Response.Write(intCount & " file(s) uploaded.<BR>")
Else
%>
<form method="post" enctype="multipart/form-data" action="weblogsupload.asp?s=upload">
<input type="file" name="file1">
<input type="submit" value="Upload">
</form>
<%
End If
%>


som også fungerer godt, men har desværre ikke rigtig held med at rette i forskellige oplysninger. Jeg vil gerne have billederne i størrelsen 300 x 200, men går også fint med den eksisterende kode, men ikke, hvis jeg begynder at ændre på den sti, hvor billedet skal gemmes. Har ændret:

file1.SaveAs("/upload/" & file1.FileName)
til
file1.SaveAs("/upload/" & Id & "/1.JPG") (Id = 1 er indsat tidligere)

hvilket også gemmer billedet korrekt, men det er nu IKKE blevet resized???

Er der nogen som kan hjælpe????

På forhånd tak.
Avatar billede innercitydk Nybegynder
09. juni 2006 - 13:21 #1
Ved ikke helt om det hjælper, men jeg bruger følgende kode til at uploade og resize billeder. Måske det kan hjælpe dig med dit resize problem:

Private Sub myUploadCode(ByVal sender As Object, ByVal e As EventArgs)
Dim strFileName As String
Dim strFileTemp As String
strFileTemp = upload_file.PostedFile.FileName.Substring(upload_file.PostedFile.FileName.LastIndexOf(".") + 1)
Dim MaxSizeWidth As Integer = 300
Dim MaxSizeHeight As Integer = 200
Dim image As System.Drawing.Image = New System.Drawing.Bitmap(upload_file.PostedFile.InputStream)
Dim bOrg As System.Drawing.Bitmap = CType(image, System.Drawing.Bitmap)
Dim format As System.Drawing.Imaging.ImageFormat = image.RawFormat
If image.Width > MaxSizeWidth OrElse image.Height > MaxSizeHeight Then
  Dim b As Bitmap = Resize(bOrg, MaxSizeHeight, MaxSizeWidth)
  b.Save(Server.MapPath("picupload/" + strFileName), format)
Else
  upload_file.PostedFile.SaveAs(Server.MapPath("picupload/" + strFileName))
End If
End Sub

Private Shared Function Resize(ByVal b As Bitmap, ByVal MaxHeight As Integer, ByVal MaxWidth As Integer) As Bitmap
Dim nWidth As Integer = b.Width
Dim nHeight As Integer = b.Height
If nHeight > MaxHeight Then
  nWidth = CType(((CType(b.Width, Double) / CType(b.Height, Double)) * CType(MaxHeight, Double)), Integer)
  nHeight = MaxHeight
End If
If nWidth > MaxWidth Then
  nWidth = MaxWidth
  nHeight = CType(((CType(b.Height, Double) / CType(b.Width, Double)) * CType(MaxWidth, Double)), Integer)
End If
Dim bTemp As Bitmap = CType(b.Clone, Bitmap)
b = New Bitmap(nWidth, nHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
Dim nXFactor As Double = CType(bTemp.Width, Double) / CType(nWidth, Double)
Dim nYFactor As Double = CType(bTemp.Height, Double) / CType(nHeight, Double)
Dim x As Integer = 0
While x < b.Width
  Dim y As Integer = 0
  While y < b.Height
    b.SetPixel(x, y, bTemp.GetPixel(CType((Math.Floor(x * nXFactor)), Integer), CType((Math.Floor(y * nYFactor)), Integer)))
    System.Threading.Interlocked.Increment(y)
  End While
  System.Threading.Interlocked.Increment(x)
End While
Return b
End Function
Avatar billede innercitydk Nybegynder
09. juni 2006 - 13:25 #2
Jeg har tidligere lavet kode der omdøber et billede ved upload.. Du kan let integrere det i din eksisterende kode:

Sub btnUploadTheFile_Click(ByVal Source As Object, ByVal evArgs As EventArgs)
Dim strFileNameOnServer As String = txtServername.Value
Dim strBaseLocation As String = Server.MapPath("../galleri/")
If "" = strFileNameOnServer Then
  txtOutput.InnerHtml = "Fejl - Der skal angives et navn."
  Return
End If
If Not (Nothing = uplTheFile.PostedFile) Then
  Try
    uplTheFile.PostedFile.SaveAs(strBaseLocation + strFileNameOnServer + ".jpg")
    txtOutput.InnerHtml = "Filen <b>" + strBaseLocation + strFileNameOnServer + "</b> er blevet uploadet"
  Catch e As Exception
    txtOutput.InnerHtml = "Fejl ved lagring af <b>" + strBaseLocation + strFileNameOnServer + "</b><br>" + e.ToString
  End Try
End If
End Sub
Avatar billede mettecarsten Nybegynder
09. juni 2006 - 13:35 #3
Virkelig tak for forslagene, men jeg kan ikke finde hoved eller hale :-) Jeg afventer lige, om andre har forslag til min eksisterende kode, som jeg har arbejdet lidt med
Avatar billede montago Praktikant
09. juni 2006 - 15:51 #4
hehe... du resizer, EFTER du har gemt filen...


For each file1 In mySmartUpload.Files

      If not file1.IsMissing Then

---<    'file1.SaveAs("/upload/" & file1.FileName)
|
|        Response.Write("FileName = " & file1.FileName & "<br>")
|        call resize("upload/",file1.FileName,140)
|        Response.Write("<img src=""upload/" & file1.FileName & """ title=""Your uploaded image""><br>")
|        intCount = intCount + 1
--->    file1.SaveAs("/upload/" & file1.FileName)
      End If
  Next
Avatar billede montago Praktikant
09. juni 2006 - 15:56 #5
hovsa...

husker du at angive den nye sti ?

file1.SaveAs("/upload/" & Id & "/" & file1.FileName)
call  resize("/upload/" & Id & "/" , file1.FileName , 300)
Avatar billede mettecarsten Nybegynder
09. juni 2006 - 21:55 #6
Montago - du er på rette spor :-)

Det betyder dog ikke noget, hvor linien file1.SaveAs("/upload/" & file1.FileName) er placeret, men tidligere har jeg ikke fået rettet "call resize .." når jeg rettede "file1...".

Mit umiddelbare eneste problem er nu, at når jeg forsøger at ændre på filens navn, så går det galt. Hvis jeg f.eks. bruger disse sætninger (Id er tidligere defineret som = 1):

file1.SaveAs("/upload/" & Id & "/" & Id)
call  resize("/upload/" & Id & "/" , Id , 300)

gemmer den godt nok filen som 1, men den resizer ikke?????????????

Hvordan kan jeg ændre filnavnet og den stadig resizer?
Avatar billede montago Praktikant
10. juni 2006 - 00:10 #7
sådan... har rettet det hele til...

<%
sub saveAs_Resized (filepath_rel , width , blog)
    Set Image = Server.CreateObject("AspImage.Image")
    Image.LoadBlob Blog , 1
   
    if width < Image.MaxX then
        ResizedY = (width / Image.MaxX) * Image.MaxY
        Image.ResizeR width, ResizedY
    end if

    Image.FileName = ( Server.MapPath(filepath_rel) )
    Image.SaveImage
   
    Set Image = Nothing
end sub

If Request("s") = "upload" Then

  Dim mySmartUpload
  Dim file1
  Dim intCount
  intCount=0

  Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload")

  mySmartUpload.Upload

  For each file1 In mySmartUpload.Files

      If not file1.IsMissing Then

        Response.Write("FileName = " & file1.FileName & "<br>")
        call resize("upload/" & file1.FileName , 300 , file1.BinaryData)
        Response.Write("<img src=""upload/" & file1.FileName & """ title=""Your uploaded image""><br>")
        intCount = intCount + 1
      End If
  Next

  Response.Write(intCount & " file(s) uploaded.<BR>")
Else
%>
<form method="post" enctype="multipart/form-data" action="weblogsupload.asp?s=upload">
<input type="file" name="file1">
<input type="submit" value="Upload">
</form>
<%
End If
%>
Avatar billede montago Praktikant
10. juni 2006 - 00:11 #8
nu kalder du saveAs_Resized  med 3 parametre:
1. den relative sti
2. bredden
3. den binære fil (så skal du ikke instantiere objectet 3 gange)

sig til hvis der er fejl
Avatar billede montago Praktikant
10. juni 2006 - 00:13 #9
btw...

Sub = funktioner som ikke returnere noget (kaldes med call)
function = funktioner som skal returnere noget
Avatar billede mettecarsten Nybegynder
10. juni 2006 - 07:25 #10
montago, jeg får denne fejl:

FileName = DSCN1753.JPG

Microsoft VBScript runtime error '800a01c1'

Argument not optional: 'BinaryData'

/weblogsupload.asp, line 45

Det kan nemt være mig, som gør et eller andet forkert :-) Kan heller ikke lige se, hvordan jeg definerer, at billedet ikke skal gemmes med dens oprindelige filnavn, men f.eks. 1.JPG og i mappen, som svarer til Id´nummeret, f.eks. 1??
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