Mybitmap.save mi riduce le dimensioni dell'immagine

martedì 14 dicembre 2010 - 19.48
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows 7  |  Visual Studio 2008

dad388 Profilo | Newbie

ciao a tutti,

io sto facendo un programma in c# per applicare un watermark a delle immagini caricate in precedenza, il vero problema è che una volta applicata la scritta o l'immagine io salvo il risultato con:
myBitmap.Save("C:\\ciao\\ciao" + i + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

L'immagine è perfetta, dimensioni cm le originali, qualità anche, ma il peso dell'immagine è ridottissimo, partendo dall'imamgine originale di 3.9Mb arrivo a quella con il watermark che pesa 535Kb.

com'è possibile?? e come potrei risolvere?

Grazie

ps: ho notato che tutti i programmi che ci sono in rete hanno questo problema.

Fantazma Profilo | Junior Member

Ciao, posso dirti come ho fatto io in vb.net.

Con questa funzione reperisco le informazioni per il codec di salvataggio

Friend Function GetEncoderInfo(ByVal mimeType As String) As Imaging.ImageCodecInfo Dim j As Integer Dim encoders() As Imaging.ImageCodecInfo encoders = Imaging.ImageCodecInfo.GetImageEncoders() j = 0 While j < encoders.Length If encoders(j).MimeType = mimeType Then Return encoders(j) End If j += 1 End While Return Nothing End Function

Poi nel flusso del programma inserisco questo per effettuare il salvataggio:

' Puoi impostare la qualità del salvataggio compresa tra 10 e 100 Dim qualityParam As New Imaging.EncoderParameter(Imaging.Encoder.Quality, 65) Dim jpegCodec As Imaging.ImageCodecInfo = GetEncoderInfo("image/jpeg") Dim encoderParams As New Imaging.EncoderParameters(1) encoderParams.Param(0) = qualityParam _bitmap.Save(IO.Path.Combine(Percorso, nomefile ".jpg"), jpegCodec, encoderParams) _bitmap.Dispose()

Variando il valore numerico di QualityParam puoi impostare il livello di compressione del file e quindi la sua grandezza in kb.
Tradurre questo in C# è facile...

Ciao

dad388 Profilo | Newbie

Grazie per la tua risposta

Con il tuo codice in VB ho tirato fuori questo

private void button5_Click(object sender, EventArgs e)
{
for (int i = 0; i < filePaths.Length; i++)
{
String path = filePaths[i];
Bitmap myBitmap = new Bitmap(path);
Graphics g = Graphics.FromImage(myBitmap);
int x7 = 1000;
int y7 = 1000;
g.DrawImage(WaterMark, x7, y7);
string newName = "C:\\ciao\\ciao" + i + ".jpg";

myImageCodecInfo = GetEncoderInfo("image/jpeg");

myEncoder = System.Drawing.Imaging.Encoder.Quality;

myEncoderParameters = new EncoderParameters(1);

myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
myBitmap.Save(newName, myImageCodecInfo, myEncoderParameters);
}
}

private static ImageCodecInfo GetEncoderInfo(String mimeType)
{

int j;

ImageCodecInfo[] encoders;

encoders = ImageCodecInfo.GetImageEncoders();

for (j = 0; j < encoders.Length; ++j)
{

if (encoders[j].MimeType == mimeType)

return encoders[j];

}

return null;

}

Funziona, ma quello che non capisco è per quale motivo solo se metto 100 mi tiene la sa vecchia dimensione più qualche Kb invece se anche metto 95 invece che 3.90 mega me ne da 2Mb.

Grazie ciao

Fantazma Profilo | Junior Member

Ciao

>Funziona, ma quello che non capisco è per quale motivo solo se
>metto 100 mi tiene la sa vecchia dimensione più qualche Kb invece
>se anche metto 95 invece che 3.90 mega me ne da 2Mb.

Il fatto è del tutto normale. Il JPG è un formato di immagine per il quale, in fase di salvataggio appunto, puoi specificarne il livello di compressione. Con 100 specifichi un basso livello di compressione (anche se un po' c'è sempre dato che è un formato a perdita di informazione), con numeri inferiori vai a specificare livelli di compressione più aggressivi.
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