Capire la compressione delle immagini JPEG

martedì 14 giugno 2005 - 11.48

digitalxp Profilo | Newbie

Salve amici, girando un po per forum e script ho trovato questo che utilizzo per ridurre le dimensioni di immagini caricate su un sito.

il problema è che la compressione è troppo bassa... eppure (non ci capisco molto di .NET) non vedo il parametro che la gestisce! Come posso inserirlo e dove?

guardate un po che schifezza:
http://www.tracousticsound.it/donne/foto.asp?ID=31

digitalxp Profilo | Newbie

lo script è in allegato perchè se lo inserisco qui mi da errore!

totti240282 Profilo | Guru

il txt non si legge sarei interessato anche iograzie.

digitalxp Profilo | Newbie

come faccio a postare il codice?

digitalxp Profilo | Newbie

Sub Page_Load(Server as Object,e as System.EventArgs)
Dim redimFoto as String = Request.Querystring("foto")
Dim RedimSizeThumb as integer = CInt(500)
Dim RedimSizeFoto as integer = CInt(500)
ReDimImg("" & redimFoto ,"" & RedimFoto,RedimSizeThumb,0)
ReDimImg("" & redimFoto ,"" & RedimFoto,RedimSizeFoto,0)
End Sub
Public Sub ReDimImg(SourcePath as String,ResizeName as string, width as integer,height as integer)
Try
'Creo l'oggetto di riferimento al file originale
Dim TmpBmp as System.Drawing.Bitmap = CType(System.Drawing.Image.FromFile(Server.MapPath(SourcePath)), System.Drawing.Bitmap)
Dim newWidth,newHeight as string
'Se il parametro height è lasciato a 0 costruisco il with in maniera proporzionata
if height = 0 Then
newHeight = Convert.ToInt32(width / TmpBmp.Width * TmpBmp.Height)
else
newHeight = height
End if
'Se il parametro with è lasciato a 0 costruisco l'height in maniera proporzionata
if width = 0 Then
newWidth = Convert.ToInt32(height / TmpBmp.Height * TmpBmp.Width)
else
newWidth = width
end if
'Creo la miniatura con lunghezza e larghezza elaborati
Dim miniaturabmp as New System.Drawing.Bitmap(TmpBmp, newWidth, newHeight)
'Distruggo l'oggetto dell'immagine originale che non mi serve +
TmpBmp.Dispose()
'controllo l'estensione e salvo la miniatura nel giusto formato
if SourcePath.toLower().EndsWith(".jpg") or SourcePath.toLower().EndsWith(".jpeg") Then
miniaturabmp.Save(Server.MapPath(ResizeName), System.Drawing.Imaging.ImageFormat.Jpeg)
elseif SourcePath.toLower().EndsWith(".gif") Then
miniaturabmp.Save(Server.MapPath(ResizeName), System.Drawing.Imaging.ImageFormat.Gif)
elseif SourcePath.toLower().EndsWith(".png") Then
miniaturabmp.Save(Server.MapPath(ResizeName), System.Drawing.Imaging.ImageFormat.Png)
else
Response.Write("Errore Formato")
'Si puo' ampliare l'elseif in questo modo:
'elseif SourcePath.toLower().EndsWith(".[Estensione]") Then
'miniaturabmp.Save(Server.MapPath(ResizeName), System.Drawing.Imaging.ImageFormat.[Estensione])
'dove [Estensione] puo essere Bmp, Emf, Exif, Tiff, Wmf
end if
miniaturabmp.Dispose()
Catch ex as System.Exception
'Nel caso stampo l'errore:
Response.Write("<hr>Errore nel ridimensionamento dell'immagine:<br>" & ex.Message & "<br><br>")
Response.Write("<br>" & ex.StackTrace & "<hr>")
End Try
Response.Write("Ridimensionamento effettuato con successo")
End Sub

digitalxp Profilo | Newbie

non mi è stato motlo d'aiuto! Quel codice che ho postato mi sta benissimo....se non fosse per la compressione troppo alta....c'è un modo di modificarla?

digitalxp Profilo | Newbie

Dunque sto quasi impazzendo ma ce la posso fare... ho trovato questo codice per determinare l'encoder dell'immagine caricata

mimeType = "image/jpeg"

Function GetEncoderInfo(mimeType As String) As ImageCodecInfo
Dim encoders() As ImageCodecInfo
encoders = ImageCodecInfo.GetImageEncoders()
For j As Integer = 0 To encoders.Length - 1
If encoders(j).MimeType = mimeType Then
Return encoders(j)
End If
Next

Return Nothing
End Function

e poi questo per salvare la nuova immagine:

' imposta la compressione a 40
Dim qualityEncoder As Encoder = Encoder.Quality
Dim quality As EncoderParameter = New EncoderParameter(qualityEncoder, 40)

' aggiunge il parametro di compressione
Dim codecParams As New EncoderParameters(1)
codecParams.Param(0) = quality

' salva in JPG
bmp.Save(fileName, jpegCodecInfo, codecParams)


bene...ehm, ehm...ora come li inserisco nel codice che già avevo?

Brainkiller Profilo | Guru

Ciao,
la programmazione non è un copia e incolla di codice, come sarebbe a dire adesso come fai ad inserirlo nel codice che già avevi ? Non ci si improvvisa programmatori da oggi a domani.

ciao
david

digitalxp Profilo | Newbie

so benissimo che la programmazione non è copia incolla e non pretendo di diventare programmatore in un giorno! Però un forum esiste per darsi una mano... e la soluzione del mio problema può servire per altri.... penso sia questa l'utilità dei forum! o sbaglio?? Cos' come ho adattato quel codice di ridimensionamento per un upload da pagina asp...penso che chi se ne intende potrebbe aiutarmi ad imlementare quella funzione ed effettuare anche la giusta compressione!

LudovicoVan Profilo | Junior Member

Ciao,

quello che sperimenti non è un livello di compressione troppo alto, bensì una perdita di qualità dovuta al ridimensionamento dell'immagine. Per risolvere questo problema non basta lavorare sulle proprietà dell'Encoder, occorre anche passare per un oggetto Graphics.

In allegato ho messo un moduletto che fa il lavoro richiesto. Spero che non sia troppo difficile da copiare, incollare e... invocare. ;-)

Coach: se hai voglia di dargli un'occhiata, ci sarebbero poche linee di codice in più rispetto all'articolo qui sul forum e non mi offenderei se voleste aggiornarlo (è un piccolo contributo che do volentieri). Senza quelle poche righe in più, i risultati prodotti dal metodo GetThumbnailImage sono per lo più inaccettabili.

HTH. -LV

fabiodm75 Profilo | Newbie

Dove è l'allegato volevo provarlo...

LudovicoVan Profilo | Junior Member

Non saprei, non passo da queste parti da parecchio. Forse non era uno zip ed è stato rimosso?

Lo riallego qui, sperando che funzioni ancora... ;)

HTH. -LV

(Peace X Love] = [++1)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5