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.


 

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

44087. Разработка рекомендаций по повышению эффективности управления оборотным капиталом предприятия (на примере ООО «Нильс-Юг» г. Самара) 6.08 MB
  Организационно-экономическая характеристика предприятия Анализ структуры и динамики имущества предприятия и источников его финансирования Оценка эффективности функционирования предприятия Оценка эффективности управления оборотным капиталом на предприятии ООО НильсЮг
44088. Анализ организации учета расчетов с покупателями и заказчиками на предприятии и определить пути их совершенствования ООО «Олимп» 3.19 MB
  Организация расчетов с покупателями и заказчиками в организации ООО Олимп Организационно-экономическая характеристика ООО Олимп Анализ расчетов с покупателями и заказчиками в ООО Олимп Совершенствование учета расчетов с покупателями и заказчиками в организации ООО Олимп
44089. Міжпоколінний конфлікт в сімї: соціологічний аналіз 392.5 KB
  Сімя є найважливішою цінністю в житті багатьох людей, що живуть у сучасному суспільстві. Кожен член суспільства, крім соціального статусу, етнічної приналежності, майнового та матеріального становища, з моменту народження і до кінця життя має такою характеристикою, як сімейно-шлюбне стан.
44090. ПОРТРЕТНАЯ ФОТОГРАФИЯ: ГЕНЕЗИС, СОВРЕМЕННОЕ СОСТОЯНИЕ ПЕЧАТНЫХ СМИ РЕСПУБЛИКИ БАШКОРТОСТАН 4.42 MB
  В повседневной журналистской практике можно увидеть, что один и тот же объект может иметь различные фактурные данные, которые могут «работать» либо богато и красноречиво, либо бедно и косноязычно. Здесь все зависит от умения репортера видеть и извлекать выразительную пластичность из самой действительности, многочисленных картин жизни.
44091. Рівень ліквідності і платоспроможності ПАТ «Рожищенський сирзавод» 255.99 KB
  Аналіз ліквідності та платоспроможності дозволяє визначити, наскільки ефективно здійснюється фінансовий менеджмент в підприємстві. Проте, як свідчать дослідження, теорія і практика аналізу ліквідності та платоспроможності в Україні знаходяться на стадії свого становлення. Більшістю підприємств подібний аналіз практично не здійснюється, що робить тему дослідження своєчасною та актуальною.
44092. Анализ работы моторного участка МП г.о. Самара «Пассажиравтотранс» 1.35 MB
  Запрещается удлинять рукоятки ключей путем присоединения другого ключа или трубы. При работе зубилом или другим рубящим инструментом необходимо пользоваться защитными очками для предохранения глаз от поражения металлическими частицами а также надеть на зубило защитную шайбу для защиты рук. Дата Экономическая эффективность разработанной конструкции Общая сумма расходов на изготовление конструкции Срасх = Сприс Кпов руб. где: Сприс стоимость приспособления руб.
44093. Проектировании учебно - лабораторного комплекса «Модель блока тепловой электрической централи» 1.13 MB
  Карагандинская ТЭЦ-3 расположена в северо-восточной части города Караганды и предназначена для покрытия тепловых нагрузок промышленности и культурно бытового сектора города. ТЭЦ-3 работает на привозном Экибастузском угле, для растопки котлов используют мазут.
44094. Изучение теоретических вопросов по учету и аудиту денежных средств ООО «Эталон – СПб» 802 KB
  Целью данной дипломной работы является изучение теоретических вопросов по учету и аудиту денежных средств,исследование их практического применения,разработка предложений по улучшению учета на предприятии и совершенствованию деятельности предприятия ООО «Эталон – СПб»
44095. Архитектура цифровой системы коммутации Квант 1011.5 KB
  Важнейшим этапом развития автоматической телефонной коммутации можно считать развитие автоматических телефонных станций АТС с программным управлением и коммутационным полем с магнитоуправляемыми герметизированными контактами герконами или электронными элементами АТС третьего поколения. Разработка АТС третьего поколения была начата в 1950е годы и шла по нескольким направлениям. Для создания новых АТС пытались использовать самые различные принципы и приборы. Многолетние исследования и разработки в конечном итоге привели к созданию АТС...