51097

Графические файлы формата BMP

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

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

Цель работы: Написать программу, реализующую просмотр графического файла (формат BMP). Программа должна: загружать и выводить на экран произвольный файл (с использованием файловых функций); читать все файлы с цветовой палитрой до 256 цветов (black/white,grey,16,256)...

Русский

2014-02-05

393.32 KB

3 чел.

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

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

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

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

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

«Графические файлы формата BMP»

Выполнил:

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

гр. Э-41, ФЭИС

Якубчик А.Н.

Проверил:

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

Брест 2013

Цель работы:

Написать программу, реализующую просмотр графического файла (формат BMP).

Программа должна:

  1.  загружать и выводить на экран произвольный файл (с использованием файловых функций);
  2.  читать все файлы с цветовой палитрой до 256 цветов (black/white,grey,16,256);
  3.  выводить информацию из заголовков файла (тип. Размер, разрешение, использование сжатия, количество цветов, …), а также цветовую палитру.

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

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;

using System.Runtime.InteropServices;

namespace lab1

{

   public partial class Form1 : Form

   {

      //-----------------

       [DllImport("winmm.dll")]

       private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);

       private string sCommand = "";

       public int k;

       public string path;

       public Color[] pixel;

       public Form1()

       {

           this.components = ((IContainer)null);

           this.path = "";

           this.k = 0;

           this.InitializeComponent();

           error = new error();

           Zooom = new Zooom();

       }

       error error;

       Zooom Zooom;

 

       private void openToolStripMenuItem_Click(object sender, EventArgs e)

       {

           this.label1.Visible = false;

           this.label2.Visible = false;

           this.label3.Visible = false;

           this.label4.Visible = false;

           this.label5.Visible = false;

           this.label7.Visible = false;

           this.label8.Visible = false;

           this.listView2.Visible = false;

           this.pictureBox1.Image = null;

           OpenFileDialog dialog = new OpenFileDialog();

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

           {

               this.path = dialog.FileName;

               FileStream stream = new FileStream(this.path, FileMode.Open, FileAccess.Read); //синхроная и асинхронная запись и чтение 

               byte[] buffer = new byte[Marshal.SizeOf(typeof(BITMAPFILEHEADER))];  //выделение памяти для неуправляемого кода

               stream.Read(buffer, 0, Marshal.SizeOf(typeof(BITMAPFILEHEADER)));   //чтение байтов из потока и запись даных в заданый буфер

               GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);      //доступ к управляемому объекту из неуправляемой памяти

               BITMAPFILEHEADER bitmapfileheader = (BITMAPFILEHEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPFILEHEADER)); //передача из неуправвляемого в управляемый память

               handle.Free();  

               if (bitmapfileheader.bfType == 0x4d42)

               {

                   this.k++;

               }

               else

               {

                   sCommand = "open \"" + @"D:\1.mp3" + "\" type mpegvideo alias MediaFile";

    //посылаем команду

    mciSendString(sCommand, null, 0, IntPtr.Zero);

    //команда для воспроизведения файла

    sCommand = "play MediaFile";

    //посылаем команду

    mciSendString(sCommand, null, 0, IntPtr.Zero);

    error.ShowDialog();

               }

           }

       }

       private void viewToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (this.k <= 0)

           {

               this.pictureBox1.Image = null;

           }

           else

           {

               int num8;

               int num9;

               int num10;

               int num11;

               this.label1.Visible = false;

               this.label2.Visible = false;

               this.label3.Visible = false;

               this.label4.Visible = false;

               this.label5.Visible = false;

               this.label7.Visible = false;

               this.label8.Visible = false;

               this.listView1.Visible = false;

               this.AutoScroll = false;

               char[,] chArray = new char[256, 4];  //256

               char[] chArray2 = new char[1024];//1024

               FileStream stream = new FileStream(this.path, FileMode.Open, FileAccess.Read);

               byte[] buffer1 = new byte[Marshal.SizeOf(typeof(BITMAPFILEHEADER))];

               stream.Read(buffer1, 0, Marshal.SizeOf(typeof(BITMAPFILEHEADER)));

               GCHandle handle = GCHandle.Alloc(buffer1, GCHandleType.Pinned);

               BITMAPFILEHEADER bitmapfileheader = (BITMAPFILEHEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPFILEHEADER));

               handle.Free();

               int biBitCount = bitmapfileheader.biBitCount;

               this.AutoScroll = true;

               this.pictureBox1.Image = null;

               int x = 0;

               int y = 0;

               int index = 0;

               Color[] colorArray = new Color[256]; //256

               int biWidth = bitmapfileheader.biWidth;

               int biHeight = bitmapfileheader.biHeight;

               int num7 = bitmapfileheader.biWidth + (((bitmapfileheader.biWidth % 4) == 0) ? 0 : (4 - (bitmapfileheader.biWidth % 4)));

               Bitmap bitmap = new Bitmap(biWidth +2 , biHeight+2  );

               switch (bitmapfileheader.biBitCount)

               {

                   case 1:

                       {

                           index = 0;

                           while (index < (((int)1) << bitmapfileheader.biBitCount))

                           {

                               num8 = stream.ReadByte();

                               num9 = stream.ReadByte();

                               num10 = stream.ReadByte();

                               num11 = stream.ReadByte();

                               colorArray[index] = Color.FromArgb(255, num10, num9, num8);

                               index++;

                           }

                           index = 0;

                           x = 0;

                           y = biHeight;

                           int ReadInString = 0; //считано битов в строке

                           int ReadGroupByte = 0; //считано байт в группе по 4

                           for (index = 0; stream.Position < stream.Length; index += 1)

                           {

                               ReadGroupByte++;

                               if (ReadGroupByte == 4)

                                   ReadGroupByte = 0;

                               if (ReadInString == biWidth)

                               {

                                   ReadInString = 0;

                                   x = 0; y--;

                                   if (y < 0)

                                       break;

                                   index += 4 - ReadGroupByte;

                                   ReadGroupByte = 0;

                                   continue;

                               }

                               else //ещё не все биты прочтены в строке

                               {

                                   num11 = stream.ReadByte();

                                   for (int j = 0; j < 8; j++)

                                   {

                                       if (ReadInString == biWidth)

                                       {

                                           x = 0; y--;

                                           break;}

                                       

                                       int indexBit = ((num11 >> (7 - j)) &1);

                                       ReadInString++;

                                       bitmap.SetPixel(x, y, colorArray[indexBit]);

                                       x++;

                                   }

                               }

                           }

 break;

                       }

                   case 2:

                       index = 0;

                       while (index < (((int)1) << bitmapfileheader.biBitCount))

                       {

                           num8 = stream.ReadByte();

                           num9 = stream.ReadByte();

                           num10 = stream.ReadByte();

                           num11 = stream.ReadByte();

                           colorArray[index] = Color.FromArgb(0xff, num10, num9, num8);

                           index++;

                       }

                       for (index = 0; stream.Position < stream.Length; index++)

                       {

                           x = index % num7; //присвоение остатка

                           y = biHeight - (index / num7);

                           num11 = stream.ReadByte();

                           x = index % num7;

                           y = biHeight - (index / num7);

                           bitmap.SetPixel(x, y, colorArray[num11]);

                       }

                       break;

                   case 4:

                       index = 0;

                       while (index < (((int)1) << bitmapfileheader.biBitCount))

                       {

                           num8 = stream.ReadByte();

                           num9 = stream.ReadByte();

                           num10 = stream.ReadByte();

                           num11 = stream.ReadByte();

                           colorArray[index] = Color.FromArgb(0xff, num10, num9, num8);

                           index++;

                       }

                       index = 0;

                       while (stream.Position < stream.Length)

                       {

                           num11 = stream.ReadByte();

                           x = index % num7;

                           y = biHeight - (index / num7);

                           bitmap.SetPixel(x, y, colorArray[num11 >> 4]);

                           bitmap.SetPixel(x + 1, y, colorArray[num11 & 15]);

                           index += 2;

                       }

                       break;

                   case 8:

                       for (index = 0; index < (((int)1) << bitmapfileheader.biBitCount); index++)

                       {

                           num8 = stream.ReadByte();

                           num9 = stream.ReadByte();

                           num10 = stream.ReadByte();

                           num11 = stream.ReadByte();

                           colorArray[index] = Color.FromArgb(0xff, num10, num9, num8); // 0хff--255

                       }

                       index = 0;

                       while (stream.Position < stream.Length)

                       {

                           num11 = stream.ReadByte();

                           x = index % num7;

                           y = biHeight - (index / num7);

                           bitmap.SetPixel(x, y, colorArray[num11]);

                           index++;

                       }

                       break;

                   case 24:

                       while (stream.Position < stream.Length)

                       {

                           num8 = stream.ReadByte();

                           num9 = stream.ReadByte();

                           num10 = stream.ReadByte();

                           x = index % num7;

                           y = biHeight - (index / num7);

                           bitmap.SetPixel(x, y, Color.FromArgb(0xff, num10, num9, num8));

                           index++;

                       }

                       break;

               }

               this.pictureBox1.Width = bitmapfileheader.biWidth ;

               this.pictureBox1.Height = bitmapfileheader.biHeight;

               this.pictureBox1.Image = bitmap;

               bitmap.Save("1.bmp");

           }           

       }

       private void pictureBox1_Click(object sender, EventArgs e)

       {

       }

       private void infoToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (this.k <= 0)

           {

               this.label1.Visible = false;

               this.label2.Visible = false;

               this.label3.Visible = false;

               this.label4.Visible = false;

               this.label5.Visible = false;

               this.label7.Visible = false;

               this.label8.Visible = false;

               this.listView2.Visible = false;

               this.AutoScroll = false;

           }

           else

           {

               this.label1.Visible = true;

               this.label2.Visible = true;

               this.label3.Visible = true;

               this.label4.Visible = true;

               this.label5.Visible = true;

               this.label7.Visible = true;

               this.label8.Visible = true;

               this.listView2.Visible = false;

               this.AutoScroll = true;

               this.pictureBox1.Image = null;

               string[] strArray = new string[10];

               FileStream stream = new FileStream(this.path, FileMode.Open, FileAccess.Read);

               byte[] buffer = new byte[Marshal.SizeOf(typeof(BITMAPFILEHEADER))];

               stream.Read(buffer, 0, Marshal.SizeOf(typeof(BITMAPFILEHEADER)));

               GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);

               BITMAPFILEHEADER bitmapfileheader = (BITMAPFILEHEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPFILEHEADER));

               handle.Free();

               if (bitmapfileheader.bfType == 19778)

               {

                   this.label8.Text = "Путь и имя файла:   " + stream.Name;

                   this.label1.Text = "Тип файла: BMP";

                   this.label2.Text = "Размер файла: " + bitmapfileheader.bfSize.ToString() + "  (байт)";

                   this.label3.Text = "Высота изображения: " + bitmapfileheader.biHeight.ToString();

                   this.label4.Text = "Ширина изображения: " + bitmapfileheader.biWidth.ToString();

                   switch (bitmapfileheader.biBitCount)

                   {

                       case 1:

                           this.label5.Text = "Количество цветов: 2";

                           break;

                       case 24:

                           this.label5.Text = "Количество цветов: палитра не используется, каждая тройка байт изображения представляет один пиксел, по байту для интенсивности синего, зелёного и красного канала соответственно";

                           break;

                       case 32:

                           if (bitmapfileheader.biCompression == 0)

                           {

                               this.label5.Text = "Количество цветов: изображение не содержит палитры";

                           }

                           else

                           {

                               this.label5.Text = "Количество цветов: Каждые четыре байта изображения представляют один пиксел, по байту для интенсивности синего, зелёного и красного канала соответственно";

                           }

                           break;

                       case 8:

                           this.label5.Text = "Количество цветов: В палитре содержится до 256 цветов, каждый байт изображения хранит индекс в палитре для одного пиксела";

                           break;

                       case 16:

                           if (bitmapfileheader.biCompression == 0)

                           {

                               this.label5.Text = "Количество цветов: изображение не содержит палитры";

                           }

                           else

                           {

                               this.label5.Text = "Количество цветов: Каждые два байта изображения хранят интенсивность красной, зелёной и синей компоненты одного пиксела";

                           }

                           break;

                   }

                   switch (bitmapfileheader.biCompression)

                   {

                       case 0:

                           this.label7.Text = "Тип сжатия: несжатое изображение ";

                           break;

                       case 1:

                           this.label7.Text = "Тип сжатия: сжатие RLE для 8-битных изображений";

                           break;

                       case 2:

                           this.label7.Text = "Тип сжатия: сжатие RLE для 4-битных изображений ";

                           break;

                       case 4:

                           this.label7.Text = "Тип сжатия: Win98/Me/2000/XP: JPEG-сжатие ";

                           break;

                       case 5:

                           this.label7.Text = "Тип сжатия: Win98/Me/2000/XP: PNG-сжатие ";

                           break;

                       case 6:

                           this.label7.Text = "Тип сжатия: WinCE: изображение не сжато, палитра содержит четыре 4-байтные маски для красной, зелёной, синей и прозрачной (альфа-канал) компонент цвета. Используется для 16- и 32-битных изображений";

                           break;

                   }

               }

           }

       }

       private void colorToolStripMenuItem_Click(object sender, EventArgs e)

       {

           if (this.k > 0)

           {

               int num2;

               int num3;

               int num4;

               int num5;

               this.label1.Visible = false;

               this.label2.Visible = false;

               this.label3.Visible = false;

               this.label4.Visible = false;

               this.label5.Visible = false;

               this.label7.Visible = false;

               this.label8.Visible = false;

               this.pictureBox1.Visible = false;

               this.listView2.Visible = true;

               this.listView2.Clear();

               string[] strArray = new string[10];

               FileStream stream = new FileStream(this.path, FileMode.Open, FileAccess.Read);

               byte[] buffer = new byte[Marshal.SizeOf(typeof(BITMAPFILEHEADER))];

               stream.Read(buffer, 0, Marshal.SizeOf(typeof(BITMAPFILEHEADER)));

               GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);

               BITMAPFILEHEADER bitmapfileheader = (BITMAPFILEHEADER)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BITMAPFILEHEADER));

               handle.Free();

               int num = 0;

               int num6 = 0;

               switch (bitmapfileheader.biBitCount)

               {

                   case 4:

                       while (stream.Position < 1078)

                       {

                           num2 = stream.ReadByte();

                           num3 = stream.ReadByte();

                           num4 = stream.ReadByte();

                           num5 = stream.ReadByte();

                           this.listView2.Items.Add(Convert.ToString(num6));

                           this.listView2.Items[num6].BackColor = Color.FromArgb(num5, num4, num3, num2);

                           num6++;

                           num++;

                       }

                       break;

                   case 8:

                       {

                          

                           while (stream.Position < 1078)

                           {

                               num2 = stream.ReadByte();

                               num3 = stream.ReadByte();

                               num4 = stream.ReadByte();

                               num5 = stream.ReadByte();

                               this.listView2.Items.Add(Convert.ToString(num6));

                               this.listView2.Items[num6].BackColor = Color.FromArgb(num5, num4, num3, num2);

                               num6++;

                               num++;

                           }

                           break;

                       }

                   case 24:

                       MessageBox.Show("Палитры нет!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Hand);

                       break;

               }

           }

       }

       private void label8_Click(object sender, EventArgs e)

       {

       }

       private void zoomToolStripMenuItem_Click(object sender, EventArgs e)

       {

           Zooom.Show();              

       }

       private void Form1_Load(object sender, EventArgs e)

       {

       }

   }

}

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

  1.  вывод информации из заголовка файла:

  1.  наличие скролов, когда изображение не помещается в окне:

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


 

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

45007. ОПТИЧЕСКИЕ ИЗМЕРЕНИЯ С ПОМОЩЬЮ ГОНИОМЕТРА Г-5 542 KB
  Измерить углы между гранями стеклянной призмы. Измерение углов призмы методом отражения. Схема измерения углов призмы методом отражения углы между нормалями к граням призмы. Призму устанавливают таким образом чтобы пучок света идущий из коллиматора отражаясь от одной из граней призмы давал в перекрестии сетки окуляра изображение щели...
45008. ИЗУЧЕНИЕ ВРАЩЕНИЯ ПЛОСКОСТИ ПОЛЯРИЗАЦИИ 412 KB
  Атомы излучают световые волны независимо друг от друга поэтому световая волна излучаемая телом в целом в течение некоторого времени наблюдения характеризуется всевозможными равновероятными колебаниями светового вектора рис. рис. Волна называется поляризованной по кругу или волной с циркулярной поляризацией если конец вектора E описывает в фиксированной плоскости перпендикулярной направлению распространения волны окружность рис. Рис.
45009. АНАЛИЗ ПОЛЯРИЗАЦИИ ЛАЗЕРНОГО СВЕТА 664 KB
  Изучить типы поляризации света и методы их описания. Ознакомиться с методикой анализа поляризации света. Провести анализ поляризации лазерного излучения. Определить угол Брюстера и показатель преломления стекла на длине волны излучения лазера.
45010. Дифракция Фраунгофера 481 KB
  Цель работы: изучение дифракции Фраунгофера на одной щели и на дифракционной решетке. Основные положения дифракции света. Необходимо отметить также что при дифракции за препятствием возникает перераспределение светового потока. Однако принцип Гюйгенса не дает информации об интенсивности волн распространяющихся в различных направлениях и не объясняет перераспределение светового потока при дифракции.
45011. ИЗУЧЕНИЕ ПРОЦЕССА ПОГЛОЩЕНИЯ СВЕТА ВЕЩЕСТВОМ 247.5 KB
  Ознакомиться с механизмом поглощения света изучить основные закономерности поглощения света веществом. ОСЛАБЛЕНИЕ СВЕТА Опыт показывает что при прохождении света через слой вещества его интенсивность уменьшается. Этот факт является результатом взаимодействия электромагнитного излучения с веществом при котором происходит поглощение и рассеяние света а также отражения света на границах раздела различных сред.
45012. Интерференция света и метод определения кривизны линзы с помощью интерференционных полос равной толщины 272 KB
  Возникновение интерференции связано во-первых с тем что для векторов напряженности электрических полей описывающих электромагнитные волны выполняется принцип суперпозиции. Так при наложении двух волн каждая из которых создает в точке наблюдения соответственно электрические поля напряженностью E1 и E2 результирующая напряженность в точке наложения будет равна: Ep = E1 E2 1 Во-вторых возникновение интерференции связано с тем что...
45013. ОСНОВНЫЕ СВОЙСТВА ОПТИЧЕСКИХ СИСТЕМ 348 KB
  Измерить фокусное расстояние оптической системы состоящей из двух линз методом Аббе. Оптической системой называется совокупность оптических деталей призмы линзы зеркала предназначенных для преобразования пучков световых лучей посредством преломления и отражения на поверхностях которыми ограничены оптические детали. Оптическую систему называют центрированной если центры сферических поверхностей или оси симметрии других поверхностей образующих оптическую систему расположены на одной прямой называемой оптической осью. Изображение...
45014. ИЗУЧЕНИЕ СПЕКТРА АТОМА ВОДОРОДА 387.5 KB
  Проанализировав результаты опыта, Резерфорд пришел к выводу, что столь сильное отклонение альфа-частиц от первоначального направления возможно только в том случае, когда внутри атома имеется чрезвычайно сильное электрическое поле, которое создается зарядом, связанным с большой массой
45015. ОПРЕДЕЛЕНИЕ ПОСТОЯННОЙ СТЕФАНА-БОЛЬЦМАНА ПРИ ПОМОЩИ ОПТИЧЕСКОГО ПИРОМЕТРА 355.5 KB
  Тепловым излучением тел называется электромагнитное излучение возникающее за счет той части внутренней энергии тела которая связана с тепловым движением его частиц. Энергетическая светимость RT количество энергии излучаемой в единицу времени с единицы поверхности тела во всем интервале длин волн. Зависит от температуры природы и состояния поверхности излучающего тела. Спектральная плотность энергетической светимости rТ=dW d количество энергии излучаемое единицей поверхности тела в единицу времени в единичном...