Работа с изображением - C# (187787)

Узнай цену своей работы

Формулировка задачи:

Добрый день. Вопрос наверно больше с логики приложения или ее организации. Пишу приложение(курсовая) некий графический редактор на Win Forms (таково задание). Все успешно реализовал: рисование, изменение размера, яркости, контрастности, насыщенности и т.п. Но столкнулся с проблемой! У меня есть ползунки(trackbar) для изменения яркости, контрастности, насыщенности и т.п. . Реализовано все это в виде функций на вход которых поступает bitmap и параметр уровня нужного мне эффекта, а на выходе получаю новый bitmap. На вход всегда приходит bitmap изображения по умолчанию и к нему применяется эффект с интенсивностью заданной трэкбаром (потому что если работать с одним битмэпом, то повернув ползунок яркости на максимум обратно уже из засвеченного изображения нормальное не получу). И из-за этого не получается нормально организовать работу приложения, что бы можно было как в обычных редакторах двигать полузнки (одновременно несколько), чтоб подобрать нужные результат (у меня же на каждый эффект поступает исходное изображение и работают они хорошо, но только если сначала выбрать яркость, потом применить, затем контрастность и ее применить и так далее). Как это сделать лучше с точки зрения логики программы? Заранее спасибо хоть за какие это варианты или направления для раздумий Постарался подробно изложить суть проблемы. На этой неделе уже нужно сдать сделал все до НГ, а эту проблему все никак не устраню

Решение задачи: «Работа с изображением»

textual
Листинг программы
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Net;
using System.Windows.Forms;
 
namespace WindowsFormsApplication327
{
    public partial class Form1 : Form
    {
        private Layer layer;
 
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
            SetClientSizeCore(500, 500);
 
            layer = new Layer();
            layer.Image = (Bitmap)Image.FromStream(new WebClient { Proxy = null }.OpenRead("http://zanogu.com/img/gentpls/tpl-m-34.jpg"));
 
            new Button { Parent = this, Text = "Color matrix" }.Click += btColorMatrix_Click;
        }
 
        private void btColorMatrix_Click(object sender, EventArgs e)
        {
            var form = new ImageColorMatrixToolForm();
            form.Build(layer);
            form.Changed += delegate { Invalidate(); };
 
            if (form.ShowDialog() == DialogResult.OK)
                layer.Image = new Bitmap(layer.Preview);
 
            layer.Preview = null;
            Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawImage(layer.Preview ?? layer.Image, ClientRectangle);
        }
    }
 
    internal class ImageColorMatrixToolForm : Form
    {
        private TrackBar tbB;
        private TrackBar tbC;
        private TrackBar tbS;
 
        private Layer layer;
        public event EventHandler Changed = delegate { };
 
        public ImageColorMatrixToolForm()
        {
            tbB = new TrackBar { Parent = this, Top = 50, Maximum = 100,  Value = 50 };
            tbC = new TrackBar { Parent = this, Top = 100, Maximum = 100, Value = 30 };
            tbS = new TrackBar { Parent = this, Top = 150, Maximum = 100, Value = 30 };
 
            new Button { Parent = this, Text = "OK", DialogResult = DialogResult.OK };
            new Button { Parent = this, Text = "Cancel", Left = 100, DialogResult = DialogResult.Cancel };
 
            tbB.ValueChanged += tbValueChanged;
            tbC.ValueChanged += tbValueChanged;
            tbS.ValueChanged += tbValueChanged;
        }
 
        private void tbValueChanged(object sender, EventArgs e)
        {
            var b = (tbB.Value - 50)/50f;
            var c = tbC.Value/30f;
            var s = tbS.Value/30f;
 
            layer.Preview = new ImageColorMatrixTool().Transform(layer.Image, b, c, s);
 
            Changed(this, EventArgs.Empty);
        }
 
        public void Build(Layer layer)
        {
            this.layer = layer;
        }
    }
 
    class Layer
    {
        private Bitmap image;
        public Bitmap Image
        {
            get { return image; }
            set 
            { 
                if (image != null) image.Dispose();
                image = value; 
            }
        }
 
        private Bitmap preview;
        public Bitmap Preview
        {
            get { return preview; }
            set
            {
                if (preview != null) preview.Dispose();
                preview = value;
            }
        }
    }
 
    class ImageColorMatrixTool
    {
        public Bitmap Transform(Image img, float brightness, float contrast, float saturation)
        {
            var imageAttributes = new ImageAttributes();
 
            var b = brightness;
            var c = contrast;
            var t = (1f - c)/2f;
            var s = saturation;
            var sr = (1 - s) * 0.3086f;
            var sg = (1 - s) * 0.6094f;
            var sb = (1 - s) * 0.0820f;
 
            float[][] colorMatrixElements = { 
               new float[] {c*(sr+s), c*sr,     c*(sr),    0, 0},
               new float[] {c*sg,     c*(sg+s), c*(sg),    0, 0},
               new float[] {c*sb,     c*sb,     c*(sb+s),  0, 0},
               new float[] {0,        0,        0,        1f, 0},
               new float[] {t+b,      t+b,      t+b,       0, 1}};
 
            var colorMatrix = new ColorMatrix(colorMatrixElements);
            imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
 
            var result = new Bitmap(img.Width, img.Height);
            using (var gr = Graphics.FromImage(result))
                gr.DrawImage(img,
                           new Rectangle(0, 0, img.Width, img.Height), 0, 0,
                           img.Width, img.Height,
                           GraphicsUnit.Pixel, imageAttributes);
 
            return result;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5