Изменение размера изображения в C#

Из архива - вдруг пригодится...
Очень часто при добавлении изображений в проект приходится изменять размеры изображения, и часто хочется это делать грамотно, с сохранением пропорций изображения. Лично мне часто бывает надо вставить картинки в ListView допустим и ужать их правильно (так чтобы не расползлись в квадрат заданных размеров). Именно в этом деле и поможет написанная ниже процедура.

Процедура изменения размеров:

static Image ScaleImage(Image source, int width, int height)
        {

            Image dest = new Bitmap(width, height);
            using (Graphics gr = Graphics.FromImage(dest))
            {
                gr.FillRectangle(Brushes.White, 0, 0, width, height);  // Очищаем экран
                gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

                float srcwidth = source.Width;
                float srcheight = source.Height;
                float dstwidth = width;
                float dstheight = height;

                if (srcwidth <= dstwidth && srcheight <= dstheight)  // Исходное изображение меньше целевого
                {
                    int left = (width - source.Width) / 2;
                    int top = (height - source.Height) / 2;
                    gr.DrawImage(source, left, top, source.Width, source.Height);
                }
                else if (srcwidth / srcheight > dstwidth / dstheight)  // Пропорции исходного изображения более широкие
                {
                    float cy = srcheight / srcwidth * dstwidth;
                    float top = ((float)dstheight - cy) / 2.0f;
                    if (top < 1.0f) top = 0;
                    gr.DrawImage(source, 0, top, dstwidth, cy);
                }
                else  // Пропорции исходного изображения более узкие
                {
                    float cx = srcwidth / srcheight * dstheight;
                    float left = ((float)dstwidth - cx) / 2.0f;
                    if (left < 1.0f) left = 0;
                    gr.DrawImage(source, left, 0, cx, dstheight);
                }

                return dest;
            }
        }
Подробнее

Разрешаем ввод в TextBox только цифр C#.

Для того чтобы разрешить ввод в поле TextBox только цифр в C#, самый простой способ воспользоваться обработчиком события KeyPress.

Вот как это делается:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsDigit(e.KeyChar)))
            {
                e.Handled = true;
            }
        }
Подробнее

Создаём свою службу на C#

Здесь я не буду приводить подробных инструкций, какую кнопочку необходимо нажать и какую менюшку ткнуть в Visual Studio. Здесь я остановлюсь на основных двух проблемных моментах с которыми сам столкнулся при создании собственной службы.

Первый момент. Собственно служба должна что нибудь делать, это что нибудь обычно делается по таймеру, вот он то никак и не запускался. Не работал, и всё тут! Выяснилось что обычный таймер System.Windows.Forms.Timer работает только на основе оконных сообщений! Находил информацию по поводу того что можно и без этого запустить как: System.Timers.Timer или System.Threading.Timer — но с ними тоже ничего не получилось. Вернулся к первому варианту, просто в отдельном потоке создал форму и таймер, ниже пример.

public partial class Service1 : ServiceBase
    {
        System.Windows.Forms.Timer timer1;
        System.Windows.Forms.Form form1;
        System.Threading.Thread thread1;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            //При запуске службы запускаем новый поток 
            thread1 = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
            thread1.Start();
            thread1.IsBackground = true;

        }


        void ThreadProc()
        {
            //Создаем во вновь созданном потоке форму и таймер 
            form1 = new System.Windows.Forms.Form();
            timer1 = new System.Windows.Forms.Timer();
            timer1.Tick += new EventHandler(timer_Tick);
            timer1.Interval = 2000;
            timer1.Start();
            form1.Show();
            //Запускаем всё это добро. 
            System.Windows.Forms.Application.Run(form1);
        }


        protected override void OnStop()
        {

            thread1.Abort();

        }

        private void timer_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            timer1.Stop();
            runProcedure(); //Запускаем процедуру (чего хотим выполнить по таймеру).
            timer1.Enabled = true;
            timer1.Start();

        }
    }        


Собственно вот так вот таймер и запустил в службе, ничего сложного, тяп ляп и всё заработало.
Но не тут то было!

Второй момент!
Как это всё теперь установить? Так чтобы это всё было в службах и запускалось само и работало.
Для того чтобы установить написанную на C# службу потребуется утилита «InstallUtil.exe» — находится она в папке с .NET 2 — у меня нашлось конкретно вот в этой папочке: C:\Windows\Microsoft.NET\Framework\v2.0.50727. У меня там было ещё куча версий, но нужный файлик был именно там.

Чтобы не прописывать пути скопировал из этой папки файлики InstallUtil.exe и InstallUtilLib.dll в папку с скомпилированным проектом службы, и запускал инсталл вот такой строчкой:

InstallUtil.exe /i MyService.exe


Но это не сработает если предварительно в проект не добавить Класс Инсталлера, делается это так: кликаете правой кнопкой мыши по Пустому месту в Дизайнере службы (в моём случае вкладка Service1.cs[Design]) и кликаете по менюшке «Add Installer». Собственно всё. После этого действия появится вкладка «Project Installer» — там в свойствах ServiceInstaller задаём название и описание нашей службы, а в свойствах ServiceProcessInstaller — от чьего имени будет выполняться служба. Если поставите в свойстве Account > User — то при установке служба спросит имя пользователя и пароль от которого будет запускаться.

Вот собственно и всё.

Подробнее

Включение виброзвонка в Windows Mobile на C#

Архив - может кому пригодится
Большинство моделей современных телефонов поддерживают функцию виброзвонка, а значит его можно использовать (например в играх при взрывах для придания ещё большей реалистичности, или при написании коммуникационных программ, для того чтобы устройство находясь в кармане дало знать о пришедшем сообщении).
 

Здесь я приведу три метода реализации виброзвонка на устройствах Windows Mobile в среде .NET CF. Хотя, по правде говоря, все они реализованы через использование API поэтому могут быть использованы не только в .NET.

Подробнее

Пример отправки почты в C#

Простой вариант отправки почты, стандартными средствами.

Для него нам необходимо подключить библиотеки:

using System.Net;
using System.Net.Mail;
using System.Net.Mime;


Сам код отправки письма с вложением:

//Указываем SMTP сервер и авторизуемся.
SmtpClient Smtp_Client = new SmtpClient("почтовый сервер", порт);
Smtp_Client.Credentials = new NetworkCredential("пользователь", "пароль");
//Выключаем или включаем SSL - (например для гугла должен быть включен).
Smtp_Client.EnableSsl = false;

//Приступаем к формированию самого письма
MailMessage Message = new MailMessage();
Message.From = new MailAddress("ot_kogo@mail.ру");
Message.To.Add(new MailAddress("komu@mail.ру"));
Message.Subject = "Тема сообщения";
Message.Body = "Само сообщение";

//Теперь прикрепим файл к сообщению...

string file = "полный путь до файла";
Attachment attach = new Attachment(file, MediaTypeNames.Application.Octet);

// Добавляем информацию для файла
ContentDisposition disposition = attach.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(file);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
disposition.ReadDate = System.IO.File.GetLastAccessTime(file);

Message.Attachments.Add(attach);

Smtp_Client.Send(Message);//непосредственно само отправление...


Вот и всё. Письмо отправлено!

Подробнее

Пример преобразования цветного изображения в черно белое на C#

   Возможно есть много методов преобразования цветного изображения в чёрно белое, и возможно даже более совершенных, но на данный момент представленный ниже метод, является самым быстрым, среди известных мне.
   Преобразование использует только стандартные библиотеки.
   Суть метода заключается не в работе с самой картинкой а в работе с блоком данных, если очень просто - то замораживаем область данных с картинкой в памяти - изменяем её как нам надо, и возвращаем всё на круги своя.

Подробнее

Условная компиляция в C#

Появилась у меня однажды задача компиляции программы под разные устройства. Ряд устройств в моём случае обладают специфическими возможностями и для них задействуются специальные библиотеки, а для некоторых обычных устройств - эти библиотеки надо исключать. Можно конечно комментировать каждый раз - но включений довольно много и такой подход весьма проблематичен.

Но есть очень хороший выход из этой ситуации, называется он условная компиляция.

Для условной компиляции используются директивы: #define, #if#else, #endif.

Подробнее

Работаем с Excel из C# (архив)

Это самый простой и примитивный пример, может пригодится, но лучше использовать OpenXML.
В данной публикации приведён пример создания и вывода документа Excel из программы написанной на языке C#.
Приведён самый простенький пример для использования в целях обучения.

Подробнее

Пример расчета EAN13 на C#

Для начала о самой процедуре:
Вся суть генерации штрихового кода EAN-13 заключается в поиске контрольного разряда (последней 13-ой цифры). 
Алгоритм поиска этого значения таков:
1) Оставляем 12 цифр (последняя 13 - контрольная которую ищем). 
2) Суммируем разряды, стоящие на четных местах.
3) Результат пункта 2 умножаем на 3 .
4) Суммируем разряды, стоящие на нечетных местах.
5) Суммируем результаты пунктов 3 и 4.
6) В полученном числе крайнюю справа цифру (остаток от деления на 10) вычесть из 10, если остаток 0 то значение равно 0.

Полученный результат и есть значение контрольной цифры.

Теперь пример на класса реализующего этот алгоритм на C#:

Подробнее

Делаем скриншоты в C# под .NET CF (из архивов)

Публикация из архивов, вдруг пригодится...
Столкнулся когда-то с необходимостью делать скриншоты с КПК, и так и не нашёл ни одной подходящей программы. А именно простой, маленькой и чтобы ничего не устанавливалось, но при этом работала.
Решил написать, часа два окучивал интернет по поводу того как это сделать - всё оказалось не так то просто, на мобильных устройствах через .NET в чистом виде не получится только через API.

Подробнее