Guide C# – Come salvare in Jpeg con Compressione Variabile

dotnet

Lavorare con le immagini JPG in C# è abbastanza semplice. In questi giorni infatti, lavorando ad un mio progetto personale per il salvataggio in batch di numerose immagini (per aggiungere Watermark e ridimensionarle in blocco), mi è sorto questo problema e vorrei quindi condividere con voi la soluzione. In pratica io vorrei salvare delle immagini a differenti valori di compressione, e per far questo in C# bisogna lavorare con i codificatori delle immagini.

Il metodo più semplice per salvare un’immagine in C# è questo:

Image image = Bitmap.FromFile("C:test.jpg");
image.Save("C:out.jpg");

Ma guardando tra gli overload della funzione Save, ho trovato anche i parametri ImageCodecInfo ed EncoderParameters che possono fare al caso nostro. Creiamo perciò un oggeto di tipo EncoderParameters:

EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 75);

dove 75 è il valore di compressione dell’immagine (che va da 0 a 100, 0 qualità bassa ma dimensione del file minore, 100 qualità massima ma dimensione del file maggiore). Ora aggiungiamo questa funzione al nostro pacchetto, che ci serve per conoscere i tipi di encoder di un determinato tipo MIME.

private 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;
}

e creiamo poi un oggetto di tipo ImageCodecInfo:

ImageCodecInfo ici = GetEncoderInfo("image/jpeg");

Adesso, come prima, salviamo l’immagine però passando anche questi due oggetti alla funzione:

image.Save(stream, ici, eps);

La funzione finale risulta:

public static void SaveJPG(Image image, string fileName, long compression)
{
EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compression);
ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
image.Save(fileName, ici, eps);
}

In questo modo possiamo salvare le immagini jpeg con la compressione che ci pare! smile emoticon

This entry was posted in Linguaggi .Net, Programmazione and tagged , , , , , , , , , , , . Bookmark the permalink.

8 Responses to Guide C# – Come salvare in Jpeg con Compressione Variabile

  1. Franz says:

    Ciao, ho provato ad usare il tuo script ma invece di salvare su uno stream l’immagine ho provato a salvarla su disco…ma da un errore generico….
    tutto = ma invece di filename come image e’ un percorso..

    Ti è capitato?
    ciao Franco

  2. Denis says:

    Ciao Franco. Scusa ma non ho capito esattamente che problema da il tuo script, se riesci a postare qualche riga di codice posso darti una mano. Magari mandami una mail, trovi l’indirizzo a fondo pagina.

    A presto! ok emoticon

  3. Artur says:

    (using System.Drawing;
    using System.Drawing.Imaging;)

    Ciao mi dà in seguente errore alla riga
    ImageCodecInfo ici = GetEncoderInfo(“image/jpeg”);

    Error 1 The name ‘GetEncoderInfo’ does not exist in the current context

  4. Denis says:

    Artur:

    Error 1 The name ‘GetEncoderInfo’ does not exist in the current context

    Ciao Artur e benvenuto! Devi aggiungere anche la funzione GetEncoderInfo alla tua classe/codice perchè funzioni. La trovi sempre nell’articolo!

    ciao emoticon

  5. Patrick says:

    Ciao Denis,
    complimenti x la chiarezza dell’articolo.
    Tutto talmente chiaro che non mi capacito del fatto che non funzioni!
    Io effettuo il salvamento su file e mi da’ un messaggio che non mi fornisce alcuna indicazione precisa, ossia
    Parametro non valido.
    L’errore e’ quindi diverso da quello di Arthur, poiche’ la classe è presente.
    Mi puoi aiutare anche solo con qualche indicazione?!
    Grazie
    Patrick

  6. Denis says:

    Patrick:

    Ciao Denis,
    complimenti x la chiarezza dell’articolo.
    Tutto talmente chiaro che non mi capacito del fatto che non funzioni!
    Io effettuo il salvamento su file e mi da’ un messaggio che non mi fornisce alcuna indicazione precisa, ossia
    Parametro non valido.
    L’errore e’ quindi diverso da quello di Arthur, poiche’ la classe è presente.
    Mi puoi aiutare anche solo con qualche indicazione?!
    Grazie
    Patrick

    Ciao Patrick e benvenuto! Ti chiedo scusa per l’estremo ritardo con cui ti rispondo ma, come ho scritto anche qui, ho avuto un pò di problemi in queste settimane. Purtroppo non so cosa da cosa dipenda il tuo errore, sicuramente c’è un errore di passaggio di parametri (da cui “Parametro non valido”), prova a darmi indicazioni più precise sulla riga d’errore e sui parametri che usi e vediamo di risolverlo!

    Fammi sapere, a presto! ciao emoticon

  7. evilripper says:

    ma quindi Bitmap.FromFile(“C:test.jpg”) legge tutti i tipi di immagine anche se si chiama bitmap? :)

  8. Denis says:

    Ahah esattamente! xD

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>