A kép JPG formátumba történő mentéséhez szükségünk lesz magára a képre. Készítsünk hát először is egy egyszerű grafikát, melyet lementhetünk majd egy állományba. A kép kezeléséhez szükségünk lesz egy Bitmap osztályra, melyet úgy hozunk létre, hogy 100 x 100 pixeles legyen. Ahhoz, hogy erre a Bitmap-re rajzolhassunk is, kellene egy Graphics osztály. Ezt úgy tudjuk létrehozni, hogy konstruktorában a Bitmap imént létrehozott példányát adjuk át. Ez fogja biztosítani, hogy a Graphics függvényeit meghívva azok a Bitmap-re rajzoljanak.
private void button1_Click(object sender, System.EventArgs e)
{
Bitmap bmp = new Bitmap(100, 100);
Graphics g = Graphics.FromImage(bmp);
Létrehozunk ezek után egy egyszerű grafikát a Bitmap-en.
Rectangle r = new Rectangle(0, 0, 100, 100);
g.FillRectangle(new LinearGradientBrush(r, Color.White, Color.Yellow, 90, false), r);
g.DrawLine(new Pen(Color.Blue, 3), 0, 0, 100, 100);
g.DrawEllipse(new Pen(Color.Red, 3), r);
Majd ezek után következik a kép mentésének előkészítése. A mentéshez a Bitmap osztály Save függvényét kell majd használnunk, ennek azonban kell néhány speciális paraméter, hogy a létrehozandó állományból JPG legyen.
Hogy a kép állomány miként legyen kódolva, azt egy ImageCodecInfo osztály fogja a Save függvénynek pontosan leírni. ic névvel létrehozunk egy ilyen változót.
ImageCodecInfo ic = null;
Ennek az ic változónak a következőképpen tudunk értéket adni. A rendszerbe telepítéskor felkerül néhány alapértelmezett képkódoló. Ezek között szerepel az is, mely a JPG-t állítja elő. Az ImageCodecInfo osztály GetImageEncoders statikus függvénye egy olyan tömböt ad vissza, mely tartalmazza az összes elérhető kódolót. Nincs más teendőnk, mint egy ciklus segítségével előkeresni a JPG formátumú kódolót, majd ezt tárolni az ic változóba a későbbi felhasználás érdekében.
ImageCodecInfo[] ici = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo c in ici)
{
if (c.MimeType=="image/jpeg")
{
ic = c;
break;
}
}
A Save függvénynek még egy paraméterre szüksége lesz, mely azt határozza meg, hogy a JPG milyen tömörítésű legyen. Ehhez szükségünk lesz egy tömbre, melynek minden eleme egy-egy EncoderParameter típusú osztályt tárol. A tömb minden eleme egy-egy paraméter tulajdonságait tartalmazza. Mostani feladatunkhoz elegendő egy olyan tömb, melynek egy eleme van, hiszen csak a tömörítést szeretnénk előírni a JPG számára. Ezt a tömböt úgy hozzuk létre, hogy készítünk egy EncoderParameters típusú osztályt, melynek konstruktorában adható meg, hogy e tömbnek hány eleme legyen. A létrejött osztály Param property-jén keresztül érhető el a számunkra szükséges tömb.
EncoderParameters ep = new EncoderParameters(1);
A példa kedvéért úgy mentjük el a létrehozott grafikánkat, hogy egy ciklus segítségével a legnagyobb tömörítéstől kezdve a legkisebbig mindegyiket kipróbálva létrehozunk egy-egy JPG állományt. Mivel a tömörítés mértékét százalékosan adhatjuk meg 0 és 100 közötti számmal, így a nullától tízig tartó ciklusunk változóját fogjuk majd tízzel szorozni.
for (long i=0; i<=10; i++)
{
A már létrehozott tömb első elemébe kerül az EncoderParameter osztály, melynek konstruktorában két paramétert adunk meg. Az egyik az Encoder felsorolt típus Quality eleme lesz, mely azt írja elő, hogy a megadandó érték a kép minőségére fog vonatkozni, vagyis minél nagyobb a megadott szám, annál jobb minőségű képet kapunk, viszont a kép tömörítése annál kisebb lesz, így nagyobb helyet foglal majd el az állomány. A második paraméterben kell megadnunk a képminőség/tömörítés értékét.
ep.Param[0] = new EncoderParameter(Encoder.Quality, i*10);
Ezt követően már jöhet a Bitmap osztály Save függvénye, ahol első paraméterként a kép állomány nevét adjuk meg, másodikként egy képkódoló osztályra van szükség, mely ImageCodecInfo típusú, végül jöhet az EncoderParameters típusú osztály, melyben a mentéshez szükséges paramétereket soroltuk fel.
bmp.Save((char)(i+65)+"_"+(i*10).ToString()+".jpg", ic, ep);
}
}