51098

Увеличение и уменьшение цифровых изображений

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы: написать программу способную производить увеличение/уменьшение исходного изображения в нецелое число раз методом билинейной интерполяции. Код программы...

Русский

2014-02-05

208.4 KB

5 чел.

Министерство Образования Республики Беларусь

Учреждение образования

«Брестский государственный технический университет»

Кафедра ЭВМ и С

Лабораторная работа №2

«Увеличение и уменьшение цифровых изображений»

Выполнил:

студент 4-го курса

гр. Э-41, ФЭИС

Якубчик А.Н.

Проверил:

Кузьмицкий Н.Н.

Брест 2013

Цель работы:

- написать программу способную производить увеличение/уменьшение исходного изображения в нецелое число раз методом билинейной интерполяции.

Код программы:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace mashtabirovanie

{

   public partial class Form1 : Form

   {

       public Form1()

       {

           this.InitializeComponent();

           this.AutoScroll = true;

         

       }

          

       public byte[] ar;

       

       

       private void Zoom(double d, int chek)

       {

           this.AutoScroll = true;

           openFIleToolStripMenuItem.Enabled = false;

           zoomToolStripMenuItem.Enabled = false;

           Bitmap ZoomImg = new Bitmap((int)(pictureBox1.Image.Width * d),

               (int)(pictureBox1.Image.Height * d)); //полученный битмап

          

           Bitmap tmp = new Bitmap(pictureBox1.Image);

           if (chek==0)

           {

               progressBar1.Value = 0;

               progressBar1.Maximum = ZoomImg.Height + 1;

               for (int i = 0; i < ZoomImg.Height; i++)

               {

                   for (int j = 0; j < ZoomImg.Width; j++)

                   {

                       ZoomImg.SetPixel(j, i, tmp.GetPixel((int)(j / d), (int)(i / d)));

                   }

                   progressBar1.Value++;

                  // Application.DoEvents();

               }

           }

           else

           {

               double nX = (double)tmp.Width / (double)ZoomImg.Width;

               double nY = (double)tmp.Height / (double)ZoomImg.Height;

               double fraction_x, fraction_y, one_minus_x, one_minus_y;

               int ceil_x, ceil_y, floor_x, floor_y;

               Color c1 = new Color();

               Color c2 = new Color();

               Color c3 = new Color();

               Color c4 = new Color();

               byte red, green, blue;

               byte b1, b2;

               progressBar1.Value = 0;

               progressBar1.Maximum = ZoomImg.Width + 1;

               for (int x = 0; x < ZoomImg.Width; ++x)

               {

                   for (int y = 0; y < ZoomImg.Height; ++y)

                   {

                      

                       floor_x = (int)Math.Floor(x * nX); //получаем число меньшее или равное задоному

                       floor_y = (int)Math.Floor(y * nY);

                       ceil_x = floor_x + 1;

                       if (ceil_x >= tmp.Width) ceil_x = floor_x;

                       ceil_y = floor_y + 1;

                       if (ceil_y >= tmp.Height) ceil_y = floor_y;

                       fraction_x = x * nX - floor_x;

                       fraction_y = y * nY - floor_y;

                       one_minus_x = 1.0 - fraction_x;

                       one_minus_y = 1.0 - fraction_y;

                       c1 = tmp.GetPixel(floor_x, floor_y);

                       c2 = tmp.GetPixel(ceil_x, floor_y);

                       c3 = tmp.GetPixel(floor_x, ceil_y);

                       c4 = tmp.GetPixel(ceil_x, ceil_y);

                       // Blue

                       b1 = (byte)(one_minus_x * c1.B + fraction_x * c2.B);

                       b2 = (byte)(one_minus_x * c3.B + fraction_x * c4.B);

                       blue = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                       // Green

                       b1 = (byte)(one_minus_x * c1.G + fraction_x * c2.G);

                       b2 = (byte)(one_minus_x * c3.G + fraction_x * c4.G);

                       green = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                       // Red

                       b1 = (byte)(one_minus_x * c1.R + fraction_x * c2.R);

                       b2 = (byte)(one_minus_x * c3.R + fraction_x * c4.R);

                       red = (byte)(one_minus_y * (double)(b1) + fraction_y * (double)(b2));

                       ZoomImg.SetPixel(x, y, System.Drawing.Color.FromArgb(255, red, green, blue));

                   }

                   progressBar1.Value++;

                   Application.DoEvents();

               }

           }

           pictureBox2.Width = ZoomImg.Width;

           pictureBox2.Height = ZoomImg.Height;

           pictureBox2.Image = ZoomImg;

           openFIleToolStripMenuItem.Enabled = true;

       }

      

       private void Form1_Load(object sender, EventArgs e)

       {

       }

       private void openFIleToolStripMenuItem_Click(object sender, EventArgs e)

       {

           OpenFileDialog open_dialog = new OpenFileDialog();

           if (open_dialog.ShowDialog() == DialogResult.OK)

           {

               Bitmap tek_bmp = (Bitmap)Image.FromFile(open_dialog.FileName);

               pictureBox1.Width = tek_bmp.Width;

               pictureBox1.Height = tek_bmp.Height;

               pictureBox1.Image = tek_bmp;

           }

           zoomToolStripMenuItem.Enabled = true;

       }

       private void zoomToolStripMenuItem_Click(object sender, EventArgs e)

       {

           Form_Zoom f = new Form_Zoom();

           if (f.ShowDialog() == DialogResult.OK)

               Zoom(Convert.ToSingle(f.info), f.biling);

       }

       private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

       {

       }

       private void toolStripProgressBar1_Click(object sender, EventArgs e)

       {

       }

   }

}

Пример тестирования:

Вывод: освоил приемы обработки графических изображений в формате BMP.


 

А также другие работы, которые могут Вас заинтересовать

19244. НЕОКЛАССИЧЕСКАЯ ДИФФУЗИЯ В МАГНИТНОМ ПОЛЕ ТОКАМАКА. ПРОВОДИМОСТЬ ПЛАЗМЫ В МАГНИТНОМ ПОЛЕ 608.5 KB
  Лекция 7 Неоклассическая диффузия в магнитном поле токамака. Проводимость плазмы в магнитном поле. Пролетные и запертые частицы. Три режима потерь €œбанановый€ €œплато€ и режим ПфиршаШлютера бомовская диффузия соотношение D и D неоклассическая диэлектрич
19245. ИСПОЛЬЗОВАНИЕ МГД ПРИБЛИЖЕНИЯ ДЛЯ АНАЛИЗА ПЛАЗМЕННЫХ КОНФИГУРАЦИЙ В ТЕРМОЯДЕРНЫХ УСТАНОВКАХ 178.5 KB
  Лекция 8 Использование МГД приближения для анализа плазменных конфигураций в термоядерных установках Уравнения МГД обобщенный закон Ома диффузия магнитного поля в плазму магнитное давлении параметр удержания . Идеальная одножидкостная гидродинамика плаз
19246. РАВНОВЕСИЕ ПЛАЗМЫ В ТЕРМОЯДЕРНЫХ УСТАНОВКАХ. ИМПУЛЬСНЫЕ СИСТЕМЫ. Z-ПИНЧИ 5.75 MB
  Лекция 9 Равновесие плазмы в термоядерных установках. Импульсные системы. Zпинчи. Проблемы равновесия плазменных конфигураций МГДустойчивость плазмы лежащей на магнитном поле устойчивость скинированного пинча. Важный круг задач в которых с успехом примен...
19247. КОЛЕБАНИЯ И ВОЛНЫ В ПЛАЗМЕ ТЕРМОЯДЕРНЫХ УСТАНОВОК 1.34 MB
  Лекция 10 Колебания и волны в плазме термоядерных установок Использование явления отсечки низкочастотной поперечной волны для диагностики плазмы колебания и волны в незамагниченной плазме; аналогия и различия с газом; заряженность частиц и различие масс дисперс...
19248. КОЛЕБАНИЯ И ВОЛНЫ В ПЛАЗМЕ В МАГНИТНОМ ПОЛЕ ТЕРМОЯДЕРНЫХ УСТАНОВОК 2.65 MB
  Лекция 11 Колебания и волны в плазме в магнитном поле термоядерных установок Теорема €œвмороженности€ магнитногополя. Колебания и волны в замагниченной плазме: магнитный звук скорость Альфена гибридные частоты магнитогидродинамические волны гиротропность п
19249. НЕУСТОЙЧИВОСТИ ПЛАЗМЫ В ТЕРМОЯДЕРНЫХ УСТАНОВКАХ 1.24 MB
  Лекция 12 Неустойчивости плазмы в термоядерных установках Неустойчивость Релея – Тейлора неустойчивость Кельвина – Гельмгольца разрывная неустойчивость перезамыкание силовых линий магнитного поля неустойчивости токовых систем Z – пинчей перетяжки винтова...
19250. УСТРОЙСТВО И РАБОТА ТОКАМАКА 1.6 MB
  Лекция 13 УСТРОЙСТВО И РАБОТА ТОКАМАКА Принцип действия принципиальная схема токамака параметры установки устойчивость тороидального плазменного шнур параметр удержания  энергетическое время жизни. Принцип действия. Принципиальная схема В заключите...
19251. УДАЛЕНИЕ ИЗ ТЕРМОЯДЕРНОЙ УСТАНОВКИ ТЕПЛА И ЧАСТИЦ, ДИВЕРТОР 136 KB
  Лекция 14 Удаление из термоядерной установки тепла и частиц ДИВЕРТОР Конфигурация скрэпслоя в токамаке с дивертором кондиционирование поверхности разрядных камер токамаков Hмода и Lмода режимов удержания плазмы Дивертор нужен не только очистки плазмы от
19252. РЕАКТОР ИТЭР 579.5 KB
  Лекция 15 Реактор ИТЭР Основные параметры ИТЭР бланкет системы диагностики плазмы выбор материалов первой стенки перспективы. Проектирование термоядерных реакторов началось в семидесятых годах прошлого века когда на установках были получены данные позво