
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! ![]()
Mi chiamo Denis Billi, ho 25 anni e sono della provincia di Ravenna. Mi sono laureato nell'estate del 2008 presso la facoltà di Ingegneria Informatica dell'università di Bologna e attualmente sto seguendo i corsi per la Laurea Specialistica in Ingegneria Informatica sempre all'università di Bologna.
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
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!
(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
Ciao Artur e benvenuto! Devi aggiungere anche la funzione GetEncoderInfo alla tua classe/codice perchè funzioni. La trovi sempre nell’articolo!
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!
ma quindi Bitmap.FromFile(“C:test.jpg”) legge tutti i tipi di immagine anche se si chiama bitmap? :)
Ahah esattamente! xD