Графика
Получить зеркальное отражение текста, картинки
Чтобы получить отраженный как в зеркале текст в PictureBox, нужно воспользоваться методом ScaleTransform. Эту технику можно использовать не только для PictureBox, но и для любых графических поверхностей: формы, принтеры, графические файлы и т.п.
private void button1_Click(object sender, EventArgs e)
{
// Создаем объект Bitmap достаточно больших размеров
Bitmap bm = new Bitmap(450, 100);
// Создаем объект Graphics из Bitmap
using (Graphics gr = Graphics.FromImage(bm))
{
// Используем сглаживание текста
gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
// Отражаем текст по горизонтали
gr.ScaleTransform(-1, 1);
// Создаем шрифт Arial размером 40
using (Font the_font = new Font("Arial", 40))
{
// Выводим отраженный текст
gr.DrawString("Отражение", the_font, Brushes.Black, -450, 0);
// Добавьте на форму PictureBox picMirror. Выводим результат в нем
picMirror.Image = bm;
}
}
}
Получить информацию о BMP-файле
Пример получения информацию о BMP-файле (высота, ширина, разрядность) без загрузки самого изображения. Подробности в .
private void ShowBMPInfo(String file)
{
FileStream fs = new FileStream(file, FileMode.Open);
BinaryReader reader = new BinaryReader(fs);
// Пропускаем заголовок файла (14 байтов)
reader.ReadBytes(14);
// Пропускаем размер структуры BITMAPINFOHEADER
reader.ReadUInt32();
// Получаем ширину и высоту
int width = reader.ReadInt32();
int height = reader.ReadInt32();
// опять пропускаем часть байтов
reader.ReadInt16();
// Получаем глубину цвета (битов на пиксел)
Int16 bitsPerPixel = reader.ReadInt16();
// Освобождаем ресурсы
reader.Close();
fs.Close();
// Выводим информацию
MessageBox.Show(width + " x " + height + " x " + bitsPerPixel);
}
private void button1_Click(object sender, EventArgs e)
{
ShowBMPInfo(textBox1.Text); // подставляем путь к файлу
}
В блоге описан еще один более быстрый способ.
Рисуем лотерейные шары
Предположим, вам надо создать учебную иллюстрацию и пометить каждый элемент соответствующими кружочками с цифрами, чтобы показать последовательность действий. Можно, воспользоваться графическим редактором, а можно выводить кружочки программно. Для реализации задачи я воспользовался своим постом в блоге . Пример я чуть-чуть видоизменил. Если в блоге речь шла о создании кружочков, которые сохранялись в файлах, то здесь я написал небольшую функцию, которая позволяет выводить кружочки в нужной позиции и с нужным числом. Функцию я назвал DrawLottoBall, так как такой способ вполне применим для генерации лотерейных шаров.
/// <summary>
/// Рисуем кружочки в заданных координатах
/// </summary>
/// <param name="x">Координата x для вывода кружочка</param>
/// <param name="y">Координата y для вывода кружочка</param>
private void DrawLottoBall(int x, int y, int number)
{
const int WID = 40;
Font the_font = new Font("Arial", 10, FontStyle.Bold);
Graphics gr = CreateGraphics();
gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
Rectangle layout_rectangle = new Rectangle(x, y, WID - 1, WID - 1);
using (LinearGradientBrush br =
new LinearGradientBrush(layout_rectangle, Color.White, Color.Blue, LinearGradientMode.ForwardDiagonal))
{
gr.FillEllipse(br, layout_rectangle);
gr.DrawEllipse(Pens.Blue, layout_rectangle);
}
StringFormat string_format = new StringFormat();
string_format.LineAlignment = StringAlignment.Center;
string_format.Alignment = StringAlignment.Center;
gr.DrawString(number.ToString(), the_font, Brushes.White, layout_rectangle, string_format);
}
private void button1_Click(object sender, EventArgs e)
{
DrawLottoBall(button1.Location.X-30, button1.Location.Y - 30, 1);
DrawLottoBall(button2.Location.X - 30, button2.Location.Y - 30, 2);
DrawLottoBall(textBox1.Location.X - 30, textBox1.Location.Y - 30, 3);
}
Другие примеры
Вращение электронов вокруг атома (RotateTransform, TranslateTransform) - animateatom.zip ( на Visual Basic)
Вращение градиентной заливки в PictureBox - rotating-gradient.zip. ( на Visual Basic)
