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.


 

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

23692. Футбол. Передачи мяча внутренней стороной стопы. Ведение мяча. Удары по неподвижному мячу 52.5 KB
  Подготовительная часть 15 минут Построение. Если даже слон научился футболу то чем мы хуже ребята Результат умножить на 4 чтобы узнать за 1 минуту. 1 мин. 1 мин.
23693. Футбол. Спорт в жизни учеников 44 KB
  8мин 1. 1мин Сидя на рабочих местах. За 2 минуты посовещавшись в своей группе сформулируйте в нескольких предложениях почему вы придерживаетесь своей точки зрения. Ученики через 2 минуты выбирают капитана который защищает точку зрения группы.
23694. Правила гри в футбол 53 KB
  Можливо саме ви а не іноземці допоможете Закарпаттю виграти Європейські кубки. стійка ноги нарізно руки на поясі: 1нахил голови вперед; 2 те саме назад; 3 те саме ліворуч; 4 те саме праворуч. 34 те саме ліворуч. стійка ноги нарізно руки в сторони: 14 по черзі колові оберти в плечових суглобах вперед; 14 те саме назад.
23695. Футбол 132.5 KB
  Слідкую за дисципліною послідовністю правильністю та якістю виконання 8 Повторення української народної гри Гопак : 2' МПЗ: народознавство підготовка до гри; 30 За командою дівчата та юнаки утворюють два кола поклавши руки на плечі один одного нагадування правил гри; 15 Присідання 12 разів 3 спроби 1 2 3 4 5 8 проведення гри; 1' підведення підсумків гри 15 ІІ Основна 27' Розрахунок на 13 1 Шикування учнів розподіл їх на відділення 30 2 Пояснення завдань на кожній станції і порядку зміни місць занять 30 Визначаю місце кожній...
23696. Гімнастика 45.5 KB
  руки в замок перед грудьми 1 руки вперед піднятись на носки вдох 2 В. видох 3 руки вверх в замок вдох 4 В. руки в замок за голову 1 поворот тулуба вліво ліва рука ривком назад за спину 2 В. стійка ноги нарізно руки на пояс 1нахил вперед прогнутись руки в сторони 2 В.
23697. Гімнастика. Рухливі ігр 74 KB
  ноги нарізнопалиця попереду. Палиця вгоруліву ногу назад на носок; В.п; Палиця вгору праву ногу назад на носок; в.п ноги нарізнопалиця попереду .
23698. Волейбол 60.5 KB
  Руки за головою спина рівно Руки на колінах 6. ноги на ширині плечей руки на поясі 14 кругові оберти голови праворуч 14 те саме ліворуч; 2 рази Темп виконання повільний 2 В. ноги на ширині плечей руки на поясі 12 нахил голови вперед 34 нахил голови назад; 2 рази Темп виконання повільний 3 В. Руки перед грудьми в замок зігнуті .
23699. Волейбол. Урок 39 KB
  Завдання уроку: Історія виникнення сучасного волейболу Продовжувати вивчати передачу м'яча знизу та зверху. Інвентар для практичної частини уроку: свисток секундомір волейбольні мячі. Хід уроку.
23700. Волейбол. Систематические занятия физической культурой и спортом 58 KB
  Задачи: Повторить технику передачи мяча сверху и верхней прямой подачи. Совершенствовать технику приема мяча снизу двумя руками. Инвентарь: волейбольные мячи на пару игроков 1 мяч малые мячи на каждого ученика волейбольная сетка 46 обручей таблицы с заданиями 23 стула секундомер свисток. ОРУ с малыми мячами.