Using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public partial class Form1 : Form {
private readonly Pen mainPen_ = new Pen(Color.Blue, 4); private Bitmap bmp_; private Point currentPoint_; private Graphics g; private Point previousPoint_;
public Form1() { this.InitializeComponent(); }
private void bOpen_Click(object sender, EventArgs e) { // Описываем объект класса OpenFileDialog var dialog = new OpenFileDialog { Filter = "Image files (*.BMP, *.JPG, *.GIF, *.PNG)|*.bmp;*.jpg;*.gif;*.png" }; // Задаем расширения файлов // Вызываем диалог и проверяем выбран ли файл if (dialog.ShowDialog() != DialogResult.OK) { return; } // Загружаем изображение из выбранного файла var image = Image.FromFile(dialog.FileName); this.pictureBox1.Width = image.Width; this.pictureBox1.Height = image.Height; // Создаем и загружаем изображение в формате bmp84 this.bmp_ = new Bitmap(image); // Записываем изображение в pictureBox1 this.pictureBox1.Image = this.bmp_; // Подготавливаем объект Graphics для рисования this.g = Graphics.FromImage(this.pictureBox1.Image); this.g.SmoothingMode = SmoothingMode.AntiAlias; }
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { // Записываем в предыдущую точку текущие координаты this.previousPoint_ = new Point(e.X, e.Y); }
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { // Проверяем нажата ли левая кнопка мыши if (e.Button != MouseButtons.Left) { return; } // Запоминаем текущее положение курсора мыши this.currentPoint_ = new Point(e.X, e.Y); // Соеденяем линией предыдущую точку с текущей
this.g.DrawLine(this.mainPen_, this.previousPoint_, this.currentPoint_); // Текущее положение курсора - в previousPoint_ this.previousPoint_ = this.currentPoint_; // Принудительно вызываем перерисовку this.pictureBox1.Invalidate(); }
private void bSave_Click(object sender, EventArgs e) { // Описываем и порождаем объект savedialog var savedialog = new SaveFileDialog { Title = "Сохранить картинку как...", OverwritePrompt = true, CheckPathExists = true, Filter = "Bitmap File(*.bmp)|*.bmp|" + "GIF File(*.gif)|*.gif|" + "JPEG File(*.jpg)|*.jpg|" + "PNG File(*.png)|*.png" }; // Показываем диалог и проверяем задано ли имя файла if (savedialog.ShowDialog() != DialogResult.OK) { return; }
var format = ImageFormat.Jpeg; switch (Path.GetExtension(savedialog.FileName)) { case "bmp": format = ImageFormat.Bmp; break; case "jpg": format = ImageFormat.Jpeg; break; case "gif": format = ImageFormat.Gif; break; case "tif": format = ImageFormat.Tiff; break; case "png": format = ImageFormat.Png; break; default: break; } this.bmp_.Save(savedialog.FileName, format); }
private void bChangePixels_Click(object sender, EventArgs e) { // Циклы для перебора всех пикселей на изображении for (var x = 1; x < this.bmp_.Width; x++) { for (var y = 1; y < this.bmp_.Height; y++) { var c = this.bmp_.GetPixel(x, y); if (c.B >= 200 && (c.R + c.G) <= 200) { this.bmp_.SetPixel(x, y, Color.Red); } } this.Refresh(); } }
Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.
Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, циклу уже точно известно, сколько раз надо выполниться.
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
private readonly Pen mainPen_ = new Pen(Color.Blue, 4);
private Bitmap bmp_;
private Point currentPoint_;
private Graphics g;
private Point previousPoint_;
public Form1() {
this.InitializeComponent();
}
private void bOpen_Click(object sender, EventArgs e) {
// Описываем объект класса OpenFileDialog
var dialog = new OpenFileDialog {
Filter = "Image files (*.BMP, *.JPG, *.GIF, *.PNG)|*.bmp;*.jpg;*.gif;*.png"
};
// Задаем расширения файлов
// Вызываем диалог и проверяем выбран ли файл
if (dialog.ShowDialog() != DialogResult.OK) {
return;
}
// Загружаем изображение из выбранного файла
var image = Image.FromFile(dialog.FileName);
this.pictureBox1.Width = image.Width;
this.pictureBox1.Height = image.Height;
// Создаем и загружаем изображение в формате bmp84
this.bmp_ = new Bitmap(image);
// Записываем изображение в pictureBox1
this.pictureBox1.Image = this.bmp_;
// Подготавливаем объект Graphics для рисования
this.g = Graphics.FromImage(this.pictureBox1.Image);
this.g.SmoothingMode = SmoothingMode.AntiAlias;
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
// Записываем в предыдущую точку текущие координаты
this.previousPoint_ = new Point(e.X, e.Y);
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
// Проверяем нажата ли левая кнопка мыши
if (e.Button != MouseButtons.Left) {
return;
}
// Запоминаем текущее положение курсора мыши
this.currentPoint_ = new Point(e.X, e.Y);
// Соеденяем линией предыдущую точку с текущей
this.g.DrawLine(this.mainPen_, this.previousPoint_, this.currentPoint_);
// Текущее положение курсора - в previousPoint_
this.previousPoint_ = this.currentPoint_;
// Принудительно вызываем перерисовку
this.pictureBox1.Invalidate();
}
private void bSave_Click(object sender, EventArgs e) {
// Описываем и порождаем объект savedialog
var savedialog = new SaveFileDialog {
Title = "Сохранить картинку как...",
OverwritePrompt = true,
CheckPathExists = true,
Filter =
"Bitmap File(*.bmp)|*.bmp|" +
"GIF File(*.gif)|*.gif|" +
"JPEG File(*.jpg)|*.jpg|" +
"PNG File(*.png)|*.png"
};
// Показываем диалог и проверяем задано ли имя файла
if (savedialog.ShowDialog() != DialogResult.OK) {
return;
}
var format = ImageFormat.Jpeg;
switch (Path.GetExtension(savedialog.FileName)) {
case "bmp":
format = ImageFormat.Bmp;
break;
case "jpg":
format = ImageFormat.Jpeg;
break;
case "gif":
format = ImageFormat.Gif;
break;
case "tif":
format = ImageFormat.Tiff;
break;
case "png":
format = ImageFormat.Png;
break;
default:
break;
}
this.bmp_.Save(savedialog.FileName, format);
}
private void bChangePixels_Click(object sender, EventArgs e) {
// Циклы для перебора всех пикселей на изображении
for (var x = 1; x < this.bmp_.Width; x++) {
for (var y = 1; y < this.bmp_.Height; y++) {
var c = this.bmp_.GetPixel(x, y);
if (c.B >= 200 && (c.R + c.G) <= 200) {
this.bmp_.SetPixel(x, y, Color.Red);
}
}
this.Refresh();
}
}
}
}
52 раза
Объяснение:
Цикл for существует в двух формах:
for счетчик:=значение to конечное_значение do
тело_цикла;
for счетчик:=значение downto конечное_значение do
тело_цикла;
Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.
Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, циклу уже точно известно, сколько раз надо выполниться.