algorytm.org

Implementacja w C#



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Korekcja gamma - Implementacja w C#
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 13 czerwca 2012 16:24
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

korekcja_gamma/Form1.cs:
//Korekcja gamma obrazu
//(c) 2012 by Tomasz Lubinski
//www.algorytm.org

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.Drawing.Imaging;

namespace korekcja_gamma
{
    public partial class Form1 : Form
    {

        /// <summary>
        /// Obraz zrodlowy i wynikowy
        /// </summary>
        private Image zrodlo;
        private Obraz wynik;

        /// <summary>
        /// Zainicjuj
        /// </summary>
        public Form1()
        {
            zrodlo = null;
            InitializeComponent();
            trackBar1_ValueChanged(null, null);
        }

        /// <summary>
        /// Wczytaj obraz
        /// </summary>
        private void wczytaj_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Title = "Otwórz obraz";
            dlg.Filter = "pliki jpg (*.jpg)|*.jpg|pliki png (*.png)|*.png|wszystkie pliki (*.*)|*.*";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                zrodlo = new Bitmap(dlg.OpenFile());
                wynik = new Obraz();
                wynik.obrazWynikowy.Image = new Bitmap(dlg.OpenFile());
                wynik.obrazWynikowy.Height = wynik.obrazWynikowy.Image.Height;
                wynik.obrazWynikowy.Width = wynik.obrazWynikowy.Image.Width;
                wynik.obrazWynikowy.Refresh();
                wynik.ClientSize = new System.Drawing.Size(wynik.obrazWynikowy.Width + 24, wynik.obrazWynikowy.Height + 32);
                wynik.Show();
                wynik.Refresh();
            }
            dlg.Dispose();
        }

        /// <summary>
        /// Korekcja gamma obrazu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            //Przygotuj tablice LUT i pokaz ja na wykresie
            wykres.Series[0].Points.Clear();
            byte[] LUT = new byte[256];
            double gamma = suwak.Value / 100.0;
            wykres.Titles[0].Text = "Tablica LUT, gamma = " + gamma;
            for (int i = 0; i < 256; i++)
            {
                if ((255 * Math.Pow(i / 255.0, 1 / gamma)) > 255)
                {
                    LUT[i] = 255;
                }
                else
                {
                    LUT[i] = (byte)(255 * Math.Pow(i / 255.0, 1 / gamma));
                }
                wykres.Series[0].Points.Add(new DataPoint(i, LUT[i]));
            }

            //Nie rob nic wiecej jezeli obraz jest jeszcze niewczytany
            if (zrodlo == null)
            {
                return;
            }

            //Kopiuj obrazek zrodlowy
            Bitmap bitmap = (Bitmap)zrodlo.Clone();
            wynik.obrazWynikowy.Image = bitmap;

            //Pobierz wartosc wszystkich punktow obrazu
            BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
            byte[] pixelValues = new byte[Math.Abs(bmpData.Stride) * bitmap.Height];
            System.Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, pixelValues, 0, pixelValues.Length);

            //Korekcja gamma dla kazdego punktu zgodnie z tablica LUT
            for (int i = 0; i < pixelValues.Length; i++)
            {
                pixelValues[i] = LUT[pixelValues[i]];
            }

            //Ustaw wartosc wszystkich punktow obrazu
            System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, bmpData.Scan0, pixelValues.Length);
            bitmap.UnlockBits(bmpData);
        }
    }
}
Dodaj komentarz