C# - Tetszőleges számú kép tárolása egy állományba

forráskód letöltése
Adott a lehetőségünk arra, hogy létrehozzunk olyan speciális kép állományt, mely úgy jön létre, hogy több különböző képet másolunk egy állományba. Az így létrehozott képből természetesen vissza is nyerhetjük a képeket egyesével.
Megvalósításhoz szükségünk lesz több képre. Ezeket vehetjük akár állományból is, de készíthetjük ezeket futási időben is. Most ez utóbbira nézzünk példát. Létrehozunk egy tömböt, benne négy Bitmap-et, melyre azt a négy képet készítjük el, amiket egy állományba tárolunk majd.
      Bitmap[] bmp = {new Bitmap(100, 100), new Bitmap(100, 100), new Bitmap(100, 100), new Bitmap(100, 100)};
Ezek után egy ciklussal létrehozunk négy, egyszerű grafikájú képet.
      for (int i=0; i<bmp.Length; i++)
      {
        g = Graphics.FromImage(bmp[i]);
        g.FillRectangle(lgb, 0, 0, 100, 100);
        g.DrawString(i.ToString(), f, sb, 0, 0, StringFormat.GenericDefault);
      }
Bár nagyon sok olyan kép típus van, mely támogatja a több kép tárolását (GIF, AVI, stb.) jelenleg csak a TIF kiterjesztésű állomány jöhet szóba több kép egyidejű tárolása szempontjából. Ehhez szükségünk lesz egy olyan kódolóra, mely képes TIF formátum előállítására. Egy ciklussal előkeressük ezt a kódolót az ImageCodecInfo osztály GetImageEncoders függvénye által visszaadott tömbből, melyben a telepített kódolók találhatók. Az eredményt egy ImageCodecInfo típusú osztályban tároljuk.
      ImageCodecInfo ici = null;
      ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
      foreach (ImageCodecInfo c in icis)
      {
        if (c.MimeType=="image/tiff")
        {
          ici = c;
          break;
        }
      }
Az állomány mentéséhez szükségünk lesz még egy paraméter megadására is. Ehhez egy EncoderParameter típust tárolni képes tömböt kell létrehoznunk, melynek egy eleme van. Erre a EncoderParameters osztály lesz alkalmas.
      EncoderParameters ep = new EncoderParameters(1);
Ebbe a paraméterbe az első kép mentésénél az EncoderValue felsorolt típus MultiFrame értéke kell, hogy kerüljön. Ezzel jelezzük, hogy több képet szándékozunk egymásba másolni. A paraméter megadása után a Save függvény hívásával mentjük az első képet egy TIF állományba.
      ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
      bmp[0].Save("_teszt.tif", ici, ep);
Ezek után megváltoztatjuk a paramétert az EncoderValue felsorolt típus FrameDimensionPage értékére. Ezzel a mentésnél azt jelezzük, hogy most egy újabb képet kell a már meglévőkhöz hozzáadni.
      ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
Egy ciklus segítségével mentjük a többi képet is a már létrehozott TIF állományba. Ehhez a művelethez a SaveAdd függvényt kell segítségül hívnunk.
      for (int l=1; l<bmp.Length; l++)
      {
        bmp[0].SaveAdd(bmp[l], ep);
      }
Az összes kép mentése után jeleznünk kell, hogy végeztünk a munkával. Ehhez a SaveAdd függvényt kell meghívni ismét, de most egy új paraméterrel, mely az EncoderValue felsorolt típus Flush értékét tartalmazza.
      ep.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush);
      bmp[0].SaveAdd(ep);
Ezzel munkánk véget ért: a TIF létrejött, benne négy különböző képpel. Jövő heti cikkünkben megvizsgáljuk, hogy az így létrejött TIF-et miként tudjuk felhasználni programból.