štvrtok, 19 marec 2015 10:11 Written by 1557 times
Rate this item
(1 Vote)

C# - Zošedenie bitmapových obrázkov

Dnes som naprogramoval malú formulárovú aplikáciu C# - malý príklad, ako zošediť farebnú bitmapu.

Podmienky:
- predpokladám u programátora základné znalosti z C# a objektového programovania
- programovacie prostredie: Microsoft Visual Studio 2010
- nastavenie projektu:
    - New project: Windows Form Application
    - Namespace: Shadebitmap
    - Assemblyname: Shadebitmap
    - Target framework: .NET Framework 4 Client Profile

Projekt som nazval "Shadebitmap". Hlavný obsah zdrojového kódu je uložený v súbore Form1.cs. V prílohe sú ďalšie súbory Form1.Designer.cs a Program.cs. 

pict1

 

pict2

 

Na formulári je vložený objekty Picturebox1. Picturebox1 obsahuje nahratý bitmapový obrázok, ktorý po spustení akcie zmeníme na čiernobiely. Po štarte aplikácie si nakopírujte obrázky do adresára, kde sa nachádza výsledný spustiteľný súbor Shadebitmap.exe a môžete skúšať. Nahrajte pomocou tlačidla "Load picture" obrázok a  stlačte tlačidlo "Turn it to gray". Výsledok je vidno ihneď. Bohužiaľ takto upravený obrázok už nie je možné jednoducho prekonvertovať na farebný späť. Slúžia na to úplne iné metódy, nie taká jednoduchá, akú sme použili teraz.

 

 private void button2_Click(object sender, EventArgs e)
        {
            if (this.pictureBox1.Image == null)
            {
                MessageBox.Show("Fill a bitmap image.", "Information",
				MessageBoxButtons.OK,
				MessageBoxIcon.Information);
                return;
            }

            Bitmap bitmap = (Bitmap) this.pictureBox1.Image;
            int w = this.progressBar1.Maximum = bitmap.Width;
            int h = bitmap.Height;
            byte c;
            Color pixelColor;

            this.progressBar1.Value = this.progressBar1.Minimum = 0;
            for (int x = 0; x < w; x++)
            {
                for (int y = 0; y < h; y++)
                {
                    pixelColor = bitmap.GetPixel(x, y);
                    c = (byte) Math.Round((double)(pixelColor.R + pixelColor.G + pixelColor.B) / 3.0, 0);
                    pixelColor = Color.FromArgb(c, c, c);
                    bitmap.SetPixel(x, y, pixelColor);
                }
                this.progressBar1.Value++;
            }
            this.progressBar1.Value = 0;
            this.pictureBox1.Refresh();
        }

Malé vysvetlenie k programu.

 

Využil som fakt, že celá škála šedých odtieňov od bielej farby po čiernu majú rovnakú hodnotu zložky R, G a B. Takže si najprv prečítam hodnoty RGB zložky farby bodu. Potom ich spočítam medzi sebou, videlím číslom 3 a zaokrúhlim. Ako výsledok dostanem spoločnú zložku pre všetky RGB zložky, ktorú potom zapíšem do všetkých zložiek novej farby a novou farbou starú prepíšem metódou "bitmap.SetPixel".


Príjemnú zábavu.

S pozdravom

 

Last modified on štvrtok, 16 apríl 2015 11:48
Alojz Benďák

Autor je administrátor webu a venuje sa programovaniu takmer 20 rokov.



  • prvý kontakt s počítačmi na strednej škole - PMD 1,2,3, PP06, Atari, Sinclair (programovanie v jazyku: strojový kód, basic a pascal):  2 roky
  • na VŠ - jazyky Turbo pascal a Turbo C: 1rok
  • programovanie databázového ekonomického širokoškálneho software v Delphi a C++ Borland (databázy Paradox): 8 rokov v Codex s.r.o. Nitra
  • programovanie webových aplikácií na databázach MySQL a MS SQL server: 1 roky na živnosť (firmy: Hermes Nitra, Schindler v Bratislave)
  • pracoval ako DBA v Homecredit Brno a vo VÚB Bratislava ako vyvojár + optimalizácie v SQL a PL/SQL na Oracle 11g (firma Accenture)
  • programoval programy pre súkromné firmy pre HW na skenovanie povrchov nádrží pre skladovanie tekutých palív (pristroj Leica)
  • momentálne pracuje ako DBA pod Oracle 11g a ako vyvojár vnútropodnikových databázových aplikacií v PHP, SQL, C++, C# a interface v PL/SQL: 8 rokov
  • ďalej programuje s HTML, CSS, Ajax, Javascript, VBA, MS visual C++ a C# malé podporné aplikácie
  • certifikát SQL expert for Oracle 11g   
  • spolupracuje a aktívne učí pre počítačové firmy: Lapis, IVIT v Nitre