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.


 

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

53847. Козацькому роду нема переводу (конкурс-змагання 2-х команд) 3-і класи 47.5 KB
  Складемо Присягу юних козачат Бути чесним і сміливим Присягаємось Боронити справедливість Присягаємось Цінувати побратимство Присягаємось Шанувати всі народи Присягаємось І плекати рідну мову Присягаємось Щоб козацькому роду не було переводу. Присягаємось на вірність Вітчизні й народу. Присягаємось Присягаємось Присягаємось Журі підводить підсумки.
53848. Сценарій спортивного свята «Козацькому роду нема переводу» 29 KB
  Зал святково прикрашений вишитим рушником короваєм із калиною та барвінкомконкурсними газетами. Ведуча Оголошується перший конкурс: Переправа. Гетьман 2 Конкурс: Гиря. 3 конкурс Інтелектуальний.
53849. Козацька Україна і наш край 360.5 KB
  Мета: повторити і закріпити матеріал теми; ознайомити із подіями що відбувалися на території нашого краю в період козаччини; поглибити знання учнів; розвивати їх пам’ять творчу уяву; формувати інтерес до історії; виховувати повагу до славного минулого нашого народу і його захисників любов до рідного краю; підготуватись до тестування з даної теми. В програмі для 5 класу зібрані початкові відомості з найважливіших тем історії України від найдавніших часів до нашого часу. Однією з цих тем є тема нашого уроку що включає такі важливі питання...
53850. Інтелектуальна гра «Козацькими стежками» 42.5 KB
  Дозволяємо і призначаємо організовувати реєстрове військо в числі 20 тис. чоловік.Це військо гетьман і старшина повинні набрати і записати в реєстр,і вони мусять перебувати в маєтках, що містяться у воєводстві Київському,не маючи нічого до воєводств Брацлавського і Чернігівського. А маєтки шляхетські мусять лишатися вільними, і в них реєстрові козаки ніде не повинні лишатись
53851. Виникнення українського козацтва. Запорозька Січ 1.2 MB
  Мета: навчальна ознайомити учнів із виникненням на українських землях козацтва й Запорозької Січі; сформувати уявлення учнів про запорозьких козаків як хоробрих вояківземлеробів; розвивальна розвивати вміння знаходити необхідну інформацію в історичних джерелах; створення атмосфери довіри і відкритості робота з різними аналізаторами; виховна формування позиції взаємодії; виховувати повагу до українських козаків захисників рідної землі. Тип уроку Комбінований Основні дати Кінець ХV століття – перші відомості про українських козаків у...
53852. МИ РОДУ КОЗАЦЬКОГО НАЩАДКИ 47 KB
  Гей долиноюгей широкою козаки йдуть Звучить пісня Ой на горі та й женці жнуть. До залу урочисто входять козаки двох куренів команд зі своїми прапорами. Показати хочем нині Як колись в Україні Веселились козаки Наші прадіди й діди. З незапамятних часів в Україні козаки славилися силою та спритністю.
53853. Математика. Теория вероятностей и математическая статистика 2.08 MB
  Вероятность наступления хотя бы одного события. Вероятность события А это число РА которое вводится для количественного описания степени объективной возможности наступления А. В первом случае вероятность каждого из элементарных исходов равна 1 6 а во втором 1 4. В общем случае если число всех элементарных исходов NW равно n то вероятность каждого из них 1 n.
53855. Фундаментальный и технический анализ 26 KB
  Фундаментальный анализ основывается на оценке эффективности деятельности предприятия-эмитента. Он предполагает изучение комплекса показателей финансового состояния предприятия; степени конкурентоспособности производимой продукции