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.
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