HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Kép mentése JPG formátumba, tetszőleges tömörítéssel


Példaprogram letöltése

7798 bájt

Ha adott egy tetszőleges kép, vagy akár mi magunk állítunk elő egyet programból és ezt szeretnénk JPG formátumba menteni, akkor a mellékelt példából megtudható, hogy miként tehetjük meg ezt. A cikkből az is kiderül, hogy a JPG tömörítés/minőség arányt miként szabályozhatjuk az állomány létrehozásakor.

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

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 167. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |