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.


 

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

80059. Планета на ім’я «Сміття»?.. 69.5 KB
  Мета: привернути увагу учнів побутових відходів; виявити джерела екологічних проблем, як наслідок неадекватних дій людей; продовжити формувати дбайливе відношення до природи; розвивати здібності «мислити глобально, діяти локально».
80060. Бережи здоров’я змолоду 59 KB
  У проекті враховано природні здатності молодшого школяра, вразливість його психіки, допитливість у пізнанні самого себе, схильність до імітації зразків поведінки дорослих, що зумовлює соціальний та особистісний розвиток учня. Важливе місце займає практична діяльність учнів разом з батьками.
80061. Я – учасник технопарку 84.5 KB
  Технопарк - це сукупність різноманітних студій з різних предметів або видів діяльності, які проводяться в певний час на території цього навчального закладу. Мета діяльності: прискорене поширення інноваційного педагогічного досвіду щодо формування життєздатного та конкурентноспроможного випускника.
80062. Рідне слово 66.5 KB
  Капітан. Наш девіз: «Чим важче завдання, Тим дорожче перемога.» Ми зібрались в класі дружно, Щоб позмагатись І про мову нашу рідну Цікаве дізнатись. Дорогенькі суперники, Щиро вас вітаємо Від усього серця свого Успіху бажаємо. Щоб трудились ви сьогодні До сьомого поту І дістали нагороду...
80063. Презентація проекту «Стежками рідного краю» 77.5 KB
  Мета: активізувати і поширити набуті під час екскурсій знання учнів про рідний край; розвивати інтелект та творчу уяву; формувати громадянські, комунікативні, історико-культурні та соціокультурні компетентності. Обладнання: мультимедійний екран, комп’ютер, мольберти, ватмани.
80064. Ритмічна вправа. Музичні ігри 121.5 KB
  Розвивати координацію рухів; відчуття ритму і такту; увагу, пам’ять; гнучкість і пластичність. Виховувати естетичні почуття, прищеплювати любов до всього красивого, витонченого. Обладнання: магнітофон, касетний запис з дитячими піснями, м’ячі.
80065. Погано одному (урок–спілкування). Вступ: Поняття про риторику як науку 98 KB
  Ознайомити учнів з поняттям «спілкування»; пояснити, що мовлення є найважнішим засобом спілкування, обміну думками і почуттями між людьми. Дати уявлення про риторику, як науку. Розвивати мовлення учнів, формувати вміння висловлювати власну думку.
80066. Перевір себе. Чого ми навчились? Чого навчає наука риторика? 86.5 KB
  Привітання гостей Учитель: Діти сьогодні до нас на урок завітали гості. Поверніться будь ласка обличчям до гостей щоб привітатися віршове привітання Учитель: Треба всім нам привітатись Учні: Добрий день Учитель: Дружно весело сказати Учні: Добрий день Учитель: Вліво вправо повернулись...
80067. Демосфенові поради 38 KB
  Мета. Познайомити дітей з новим навчальним предметом - риторикою, з історією виникнення риторики, порадами Демосфена, розвивати усне мовлення учнів, виховувати почуття ввічливості. Обладнання: малюнок із зображенням Риторинки на Демосфена, лялька - Риторинка, посібник «Риторика», зошит.