Работа с изображением - 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;
}
}
}