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.


 

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

84255. Строение, размеры, формы, химический состав вирусов и фагов. Классификация вирусов 37.28 KB
  Классификация вирусов формы химический состав вирусов и фагов. Классификация вирусов Вирусная частица вирион состоит из спирально закрученной нуклеиновой кислоты ДНК или РНК покрытой снаружи белковой оболочкой капсидом. Содержание нуклеиновой кислоты и белка у разных вирусов неодинаковое.
84256. Репродукция вирусов. Развитие вирулентного и умеренного фагов. Понятие о лизогенной культуре 78.28 KB
  На этой стадии происходит прикрепление вируса к поверхности клетки. Внутрь клетки проникает лишь нуклеиновая кислота. Инъецированная нуклеиновая кислота фага прежде всего вызывает полную перестройку метаболизма зараженной клетки. Выход фагов из клетки.
84258. Способы питания микроорганизмов 33.22 KB
  Пищей обычно называют вещества которые попав в живой организм служат либо источником энергии необходимой для процессов жизнедеятельности либо материалом для построения составных частей клетки. Голофитный способ живые существа используют питательные вещества всасывая их в виде относительно небольших молекул из водного раствора. Чтобы проникнуть в клетку питательные вещества должны находиться в растворенном состоянии и иметь соответствующий размер молекул. Однако это не означает что микроорганизмы не используют высокомолекулярные...
84259. Химический состав микробной клетки 33.69 KB
  Связанная вода входит в состав коллоидов клетки и с трудом высвобождается из них. С потерей связанной воды нарушаются клеточные структуры и наступает гибель клетки. При удалении свободной воды гибели клетки не происходит.
84260. Механизмы поступления питательных веществ в клетку 32.25 KB
  ЦПМ регулирует не только поступление веществ в клетку но и выход из нее воды разнообразных продуктов обмена и ионов что обеспечивает нормальную жизнедеятельность клетки. Существует несколько механизмов транспорта питательных веществ в клетку: простая диффузия облегченная диффузия и активный транспорт. Транспорт веществ через цитоплазматическую мембрану схематично изображен на рис.
84261. Пищевые потребности и типы питания микроорганизмов 42 KB
  В зависимости от источника углерода микроорганизмы делятся на: автотрофы сами себя питающие которые используют углерод из неорганических соединений углекислого газа и карбонатов; гетеротрофы питаются за счет других используют углерод из органических соединений. В зависимости от источника энергии различают: фототрофы микроорганизмы которые в качестве источника энергии используют энергию солнечного света; хемотрофы энергетическим материалом для этих микроорганизмов являются разнообразные органические и неорганические вещества....
84262. Понятие о конструктивном и энергетическом обмене 38.76 KB
  Из веществ среды перенесенных в клетку собираются строительные блоки из которых формируются биополимеры клетки и синтезируются белки жиры углеводы нуклеиновые кислоты и другие клеточные компоненты. Обмен веществ можно рассматривать как сумму двух явлений: катаболизма энергетического обмена представляющего собой ферментативное расщепление крупных органических молекул с выделением свободной энергии которая запасается в виде макроэргических связей в молекулах АТФ; анаболизма конструктивного обмена представляющего собой синтез...
84263. Энергетический метаболизм, его сущность. Макроэргические соединения. Типы фосфорилирования 35.11 KB
  Энергия образуемая при энергетическом обмене трансформируется в энергию макроэргических связей молекул АТФ. Процесс образования АТФ называется фосфорилированием. Механизм образования АТФ у разных групп микроорганизмов неодинаков. Фотофосфорилирование образование АТФ при поглощении квантов света молекулами хлорофилла.