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.


 

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

37355. Средства и технологии разработки приложений Windows CGI 91.1 KB
  Протокол CGI - Common Gateway Interface служит для связи веб-сервера с другими программами. На его основе работают гостевые книги, форумы, интернет-магазины и любые другие интерактивные сайты. Заполняя HTML-форму на сайте, нажимая кнопку Отправить, после чего обозреватель передает данные веб-серверу
37356. Основний навчально-програмний матеріал з філософії 48.5 KB
  Періодизація античної давньогрецької і давньоримської філософії. Підперіоди античної філософії. Головний зміст досократичної філософії.
37357. ВАЛЕОЛОГИЯ КУРС ЛЕКЦИЙ 2.88 MB
  Это стиль и право автора преподносить информацию в таком виде Высокий профессионализм автора имеющего медицинское психологическое и педагогическое образование позволил осветить избранный круг вопросов по здоровому образу жизни медикосоциальным психологическим и юридическим аспектам долголетия сердечнососудистым заболеваниям алкоголизму абортам двигательной активности и другим социально значимым вопросам. Надеюсь что студенты и преподаватели педагогических вузов колледжей и лицеев с гуманитарным уклоном а также многочисленные...
37358. Общие требования и порядок выполнения курсовой работы 339 KB
  Что оценивает научный руководитель в твоей курсовой работе При оценке работы учитывается актуальность степень самостоятельности качество проведенного лингвистического анализа уровень общей и профессиональной грамотности. Работа над курсовым исследованием Нужно знать что работа над курсовым исследованием состоит из нескольких этапов: формирование замысла работы определение объекта и предмета исследования цели работы; поиск и обработка специальной литературы по проблеме исследования; отбор и подготовка фактического материала;...
37359. Упаковка и брендинг продукта: шоколад 5.99 MB
  Бренд - известная торговая марка, окружённая набором ожиданий, ассоциированных с продуктом или услугой, которые типично возникают у людей. Создание бренда (брендинг) - один из самых важных этапов формирования потребительской аудитории товара, продукта или услуги.
37362. Выдача иностранным гражданам и лицам без гражданства вида на жительство в РФ 48 KB
  Вид на жительство — документ, выданный иностранному гражданину в подтверждение его права на постоянное проживание в Российской Федерации, а также его права на свободный выезд из Российской Федерации и въезд в Российскую Федерацию. Вид на жительство, выданный лицу без гражданства, является одновременно и документом, удостоверяющим его личность.