Работа с изображением - 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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д