C# - Két tetszőleges kép közötti áttetszőség

forráskód letöltése
Ha adott két tetszőleges képünk és azt szeretnénk elérni, hogy e két képet egymásra helyezve azok valamilyen általunk megadott mértékben áttetszők legyenek és így az egyik kép alatt látható legyen a másik, akkor ennek módját megismerhetjük a mellékelt példából.
A jelenleg megvalósított algoritmus feltételezi, hogy két feldolgozandó kép mérete megegyezik!
A megvalósítás lényege arra alapszik, hogy végig megyünk a két kép minden pixelén és az azonos pozíciókban lévő pixelek aktuális értékét figyelembe véve, valamint egy százalékos értéket is figyelembe véve - mely az átlátszóságot adja meg két kép között - kiszámítjuk az új kép adott pixelére beállítandó szín értékét.
Mivel RGB színekkel dolgozunk, így ezt a számítást mind a három színösszetevőre külön-külön kell elvégeznünk.
Szükségünk lesz tehát három Bitmap-re: az első kettő tárolja két képet, míg a harmadikra állítjuk elő a két kép alapján az újat.
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
      Bitmap bmp1 = (Bitmap)pictureBox1.Image;
      Bitmap bmp2 = (Bitmap)pictureBox2.Image;
      Bitmap bmp3 = new Bitmap(80, 80, e.Graphics);
Szükségünk lesz még egy 0 és 1 közötti számra, mely azt határozza meg, hogy melyik kép hány százalékig látható.
      Double d = (100-(double)trackBar1.Value)/100;
Ezt követően egy kettős ciklussal végig megyünk a képek összes pixelén.
      for (int y=0; y<bmp1.Height; y++)
      {
        for (int x=0; x<bmp1.Width; x++)
        {
A c1 és c2 Color típusú változókba mentjük az adott pixel színét.
          c1 = bmp1.GetPixel(x, y);
          c2 = bmp2.GetPixel(x, y);
Majd minden színösszetevőre kiszámítjuk a szükséges új színt. A piros esetében vesszük az c1 és c2 piros összetevőjét. Az egyik esetben d-vel szorzunk a másiknál, pedig 1-d-vel. Erre azért van szükség, mert így minél jobban látható az egyik kép, annál halványabb lesz a másik. Mivel d érétek 0 és 1 között mozog, így az 1-d pont az ellenkező százalékos értéket adja.
          r = Convert.ToInt32((double)c1.R * d + (double)c2.R * (1-d));
          g = Convert.ToInt32((double)c1.G * d + (double)c2.G * (1-d));
          b = Convert.ToInt32((double)c1.B * d + (double)c2.B * (1-d));
          c = Color.FromArgb(r, g, b);
          bmp3.SetPixel(x, y, c);
        }
      }
A ciklusok végén már nincs más teendőnk, mint az új képet kirajzolni a Form-ra.
      e.Graphics.DrawImage(bmp3, 100, 150, 80, 80);
    }