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 biztosítja, hogy a Graphics függvényeit meghívva azok a Bitmap-re rajzoljanak.
Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
Dim bmp As New Bitmap(100, 100)
Dim g As Graphics = Graphics.FromImage(bmp)
Létrehozunk ezek után egy egyszerű grafikát a Bitmap-en.
Dim r As 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 pontosan leírja a Save függvénynek. Létrehozunk egy ilyen változót ic névvel.
Dim ic As ImageCodecInfo = Nothing
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.
Dim ici As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
Dim c As ImageCodecInfo
For Each c In ici
If c.MimeType = "image/jpeg" Then
ic = c
Exit For
End If
Next c
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.
Dim ep As 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 szorozzuk majd tízzel.
Dim i As Long
For i = 0 To 10
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 vonatkozik, 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(Convert.ToChar(i + 65) + "_" + (i * 10).ToString() + ".jpg", ic, ep)
Next i
End Sub 'button1_Click